
V Команды ассемблера
Думаю те, кто читает эту статью не раз видели ассемблер "в лицо" ) Система команд в этом языке программирования не так сложна, как кажется. Главное запомнить, что в конце каждой строки не обязательно ставить точку с запятой (хотя это может только у меня такая проблемма после си), так как точка с запятой -- это комментарии. Ни для кого не секрет, что внутри компьютера всё записывается как нули и единички (образно говоря), т.е. в двоичном коде. Программирования первых компьютеров именно так и осуществлялось, с помощью только нулей и единиц. Вскоре люди поняли, что это не очень удобно использовать только нолики и единички, поэтому был придуман язык ассемблера, как симолический аналог машинного языка. Отсюда можно сделать вывод, что машинные команды -- это определенно сформированная последовательность нулей и единиц. Что бы было более понятно, приведу пример самой распространенной команды:
mov ebx, eax*
Эта команда копирует содержимое регистра eax в регистр ebx.
Такая же машинная команда будет выглядеть так:
8B D8
Значение 8B -- код операции. Вот еще один пример:
mov ecx, 128
Эта команда записывает в регистр ecx десятичное число 128. Такая же машинная команда выглядет так: B9 00000080
Как вы видите, несмотря на то, что команда в обеих примерах одна и та же (MOV), коды машинных команд разные. Отсюда можно сделать вывод, что большинство команд ассемблера могут по разному переводится в машинные команды, это зависит от операндов, с которыми они работают.
*mov приемник, источник. Запомните эту команду, она вам очень понадобится.
VI Первая программа
Итак, пришло, наконец-то, время для написания нашей первой программы. Это будет самая простая программка "Hello Antichat!". Думаю вы поняли, что она будет делать (кто не понял, объясняю, это программка будет выводить сообщение "Hello Antichat!").
Я сразу выложу вам код, а после него мы разберем эту программку.
Код:
MODEL SMALL ; Объявляем модель памяти
STACK 256 ; Объявляем размер стека
DATASEG ; Начало сегмента данных
msg db 'Hello Antichat! $' ; создаем переменную msg с текстом "Hello Antichat!"
CODESEG ; Начало сегомента кода
start: ; "вход в главную часть"
mov ax, @data ; связываем сегмент данных
mov ds, ax ; с регистром ds
mov dx, offset msg ; в регистр dx аддрес переменной msg
mov ah, 09h ; в регистр ah 09h
int 21h ; прерывание №21
mov ah, 1h ; в регистр ah - 1h
int 21h ; прерывание 21
mov ah, 04ch ; в регистр ah 04ch
int 21h ; прерываение 21
end start ;закончить "главную часть"
VII Разбор программы
Итак, теперь по порядку.
1 строка -- эта команда определяет модель сегментации программы, чтоб сильно Вас не нагружать скажу в двух словах, для небольших программок (а мы пока что такие и пишем), используйте модель SMALL (т.е. код занимает один сегмент, данные объеденены в одну группу с именем DGROUP.) В конце статьи я укажу ссылки, и литературу, где можно об этом прочитать.
2 строка -- в комментарии уже сказал, добавить нечего, объявляем размер стека
4 строка -- создаем переменную msg типа db. На этом мне бы хотелось немного остановится. Совсем капельку. Существует три типа переменных db (Data Byte), dw (Data Word) и dd (Data Doubleword). Что ж, я, например, в большнистве случаев использую db и, пока-что, в начале обучения, советую тоже использовать db. Вы спросите, зачем знак доллара в конце строки? Я отвечу, знак доллара мы пишем, чтоб можно было использовать удобную функцию ассемблера для вывода строки. Об этом я скажу позже.
7-8 строка -- помните я говорил, что существуют сегментные регистры, и что каждый из них соответствует определенному сегмунту? Так вот, в этих двух строках, используя промежуточный регистр ax, вы записываем в регистр ds физический адресс сегмента данных.
9 строка -- в регистр dx помещаем адресс переменной msg, почему именно так, я расскажу слудеющем разделе.
10 строка -- в ah записываем 09h, зачем это делать, я опять таки расскажу в следующем разделе.
11 строка -- операция прерывания дос. Int сокращенно от interupt, что переводится как прерывание.
12 строка -- в регистр ah 04ch
13 строка -- операция прерывания
14 строка -- закончить "главную часть"
Думаю стало немного более понятно.