Assembler for newbies in Low level Programming
Ассемблер для новичков в низкоуровневом программировании.
Киньте грязью в того, кто вам скажет, что Ассемблер - очень сложный для изучения язык. И никогда не читайте глупых книг, в которых написана подобная чушь. О том, что это очень сложно, говорят и пишут люди, у которых в свое время не хватило смелости (и/или ума) попытаться "въехать" в "машинные коды", "прерывания", "порты ввода-вывода" и прочую низкоуровневую "чепуху", с которой рано или поздно сталкивается любой профессиональный программист. Можно сколько угодно ругать глюки в "винде", кривой SQL в Delphi, Билла-Гейтса или "эту проклятую зидовскую мамку" - это не избавляет от элементарного невежества в области "компьютерных технологий". А без знания последних любой программист может уподобиться танцору, которому мешает танцевать сами знаете что :)...
Iczelion.
Выпуск 00.
Я начну с утверждения что чем ниже “уровень” программирования, тем больше возможностей. Чем это обуславливается? Да тем, что различные компиляторы, и другие “шняги” высокоуровнего программирования навязывают нам свои законы, правила, по которым нам приходится играть. В программировании на асме у нас есть два набора правил, это правила диктуемые процессором, и те что мы устанавливаем сами.
Сначала мы будем изучать программирование на ассемблере под MS DOS. Почему под ДОС, ведь эта ОС устарела и мало кем используется? Просто потому что я не хочу чтобы ты уснул на первых страницах рассылки, т.к. Это будет слишком уж много теории, а к тому-же еще и API...
Значит что нам необходимо:
Хотябы минимальное знание какого нибудь языка программирования высокого уровня (C/C++, Pascal/Delphi, или другой).
Минимальное знание команд ДОС (как то cd, dir, copy, move). Если не знаете,обращайтесь ко мне.
MS DOS установленная на жестком диске, или в виртуальной машине. (url на файлы для Connectix Virtual PC внизу страницы). Для счастливых обладателей Linux есть Dosemu отличный эмулятор Доса и кажется FreeDos.
MASM или TASM как транслятор и линковщик.
Какой нибудь редактор. (Можно пользоваться EDIT который входит в состав DOS) Я предпочитаю UltraEdit32.
Отладчик. Cv, Td, соответственно от Microsoft и Borland (входят в пакеты Masm и Tasm). Для продвинутых SoftIce.
Дизассемблер IDA
Ну чтож, хватит разглагольствовать, начнем.
Если по честному, хотел я начать с небольшой эдакой лекции про биты, и байты, но все-таки проктика по моему главнее, так-что вот вам простенький hello world в лучших традициях программирования.
;--------------------------------------------------------
Title Hello_World ; не несет никакой смысловой нагрузки
Codseg segment ; директива сегмента, короче сегмент кода.
org 100h ; суровая необходимость .com программ.
Begin: ; начало программы. Метка начала программы.
mov ax,codseg ; эта и след строки – инициализация сегмента данных.
mov ds,ax
mov DX,offset text ; помещаем в регистр DX смещение (в байтах) метки (переменной) text)
mov ah,09h ; помещаем в AH номер вызываемой функции (вывод текста, адрес которого лежит в DX)
int 21h ; вызываем 21h прерывание.
mov ah,4ch ; номер вызываемой функции (4Ch – выход из программы)
int 21h ; вызываем 21h прерывание.
text db 'Hello World!!!$' ; наш текст, $ означает конец строки
Codseg ends
end Begin
;--------------------------------------------------------
компилируем так:
masm hello.asm,,,;
линкуем (собираем в exe) link hello.obj,,,;
да, link выведет вам предупреждение, что типа “no stack segment” , но не обращай внимания, это нормально.
Ты наверное уже знаешь, что такое переменная, что она имеет свой тип, и т.д. В ассемблере переменной может быть ячейка памяти, или регистр (в основном). Т.е. Над ними мы и будем проводить всякие экперименты.
Регистр – это такая сверхбыстрая ячейка памяти находящаяся внутри процессора. Регистров всего много, но в основном для своей работы мы будем пользоваться регистрами обшего назначения и сегментными. Вот они: AX,CX,BX,DX и сегментные: CS,DS,SS,ES.
Бит – минимальная еденица данных, он может быть равным 0 или 1, (двоичная система счисления).
Поскольку бит – не очень удобная еденица, придумали байт, который равен 8 битам. (они нумеруются справа налево, т.е. Самый правый является самым первым).
Два байта – слово(word), два слова -двойное слово(double word).
В слове 16 бит.
1 Килобайт равен 1024 байта, 1 мегабайт равен 1024 Kb, 1 гигабайт равен 1024 Mb, 1 терабайт равен 1024 Gb.
Регистры у нас являются 16 битными, следовательно в них можно вместить одно слово.
Для совместимости со старыми моделями процессоров, а так – же просто для удобства программистов, наши регистры общего назнач. логически разделены на 2 8-битных регистра – AL и AH (от англ. Higner и Low), т.е BX/BH/BL, CX/CH/CL, DX/DH/DL.
То есть мы можем обратиться к старшему байту регистра AX таким образом к примеру:
mov ah,11 ; команда mov помещает значение второго операнда в первый. Операнд – число, метка, переменная, все что угодно.
; в данном случае помещает число 11 в регистр ah.
Да, работать мы с вами будем в основном с байтами и словами, т.к. именно ими “кодируются “ цифры, буквы(ASCII).
ПЕРВЫЙ БАЙТ – ЭТО БАЙТ СПРАВА!!!
Теперь проведем небольшую модификацию нашей програмки, заставим её переводить указатель на новую строку. Так, нам надо вставить после текста число 113(код клавиши enter), т.к. 9 функция доса воспринимает её как сигнал того, что надо перевести указатель на начало новой строки. Чтобы записать число 113, надо понять как записываются числа в асме. Обин байт может вместить 2 числа, 2 разряда, т.е. Обин байт может вместить максимум число 99. Следовательно надо число 113 разбить на разряды, и получим то что надо! Следовательно 13, 10 – искомое число.
text db 'Hello World!!!', 13,10,'$' ; наш текст, $ означает конец строки
теперь скомпилировав, получаем искомое – прога переводит строку после Hello world
Теперь небольшое домашнее задание – сделайте такую программку, которая выводит hello world несколько раз, каждый раз на новой строке.
Файлы для Connectix Virtual PC( диск с предустановленной MS-DOS)
http://ass3mbler.narod.ru/dos.part01.rar
http://ass3mbler.narod.ru/dos.part02.rar
http://ass3mbler.narod.ru/dos.part03.rar
http://ass3mbler.narod.ru/dos.part04.rar
http://ass3mbler.narod.ru/dos.part05.rar
http://ass3mbler.narod.ru/dos.part06.rar
http://ass3mbler.narod.ru/dos.part07.rar
http://ass3mbler.narod.ru/dos.part08.rar
http://ass3mbler.narod.ru/dos.part09.rar
вес каждого файла ~488 kb
Добро пожаловать в мир низкоуровнего программирования, мир где программист – царь и бог!
Автор рассылки Skif_Quest.