Анализ программного кода «Hello World!» на ассемблере.MS-DOS и TASM 2.0
Проведем анализ программного кода нашей первой программы на ассемблере.
1 2 3 4 5 6 7 8 9 10 11 12 13 | ;Строка, после точки с запятой является комментарием ;и не обрабатывается ассемблером ;prg.asm - название файла. .model tiny ;создаём программу типа СОМ .code ;начало сегмента кода org 100h ;начальное значение смещения программы в памяти - 100h start: mov ah,9 ;номер функции DOS - в АН mov dx,offset message ;адрес строки - в DX int 21h ;вызов т.н. "прерывания" - системной функции DOS ret ;завершение СОМ-программы message db "Hello, World!",0Dh,0Ah,'$' ;строка для вывода end start ;конец программы. |
Вид строки программного кода.
Программа на языке ассемблера состоит из строк, имеющих следующий вид:
метка команда(директива) операнды ;комментарий
Любое из этих полей необязательно.
Метка может быть любой комбинацией букв английского алфавита, цифр и символов _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие можно включить командной строкой ассемблера.
Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера.
В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву).
В поле комментариев, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно — текст от символа «;»
до конца строки не анализируется ассемблером.
Метки и директивы.
- TINY определяет модель памяти файлов типа СОМ, в которой сегменты кода, данных и стека объединены.
- Директива .CODE обозначает начало сегмента кода. Для нашей модели памяти в этом сегменте будут находится также и данные.
- ORG 100h — смещение в памяти, куда проецируется программа типа СОМ. «H» — обозначает, что число в шестнадцатеричной системе счисления(в десятеричной системе — это 256). Первые 256 байт (100h) используются операционкой.
- start: — метка перед первой командой программы. Метка может иметь практически любое название (с определёнными исключениями — нельзя использовать имена, включённые в ассемблер). Например, можно «begin_1:», но нельзя «mov:
- В конце кода мы видим директиву end, после указанной директивы — нашу метку — start. Это обозначает одновременно и
окончание кода программы и то, что программа начнёт выполняться именно с места, указанного меткой (команда mov ah,9).
Данные.
В этом же сегменте кода, разместились и наши данные:
1 | message db "Hello World!",0Dh,0Ah,'$';строка для вывода. |
- $ — обязательный символ окончания строки для функции вывода текста на экран т.н. терминатор строки (в программировании на Си, в качестве отметки окончания строки используется т.н. «нуль-терминатор» — число 0).
- 0Dh — код символа ASCII «возврат каретки».
- 0Ah — код символа ASCII «перевод строки».
- «Hello World!» — строка с текстом должна быть помещена в двойные или одинарные кавычки.
- message — метка (всего лишь условное название места расположения строки кода).
- db — «Define Byte». Даёт понять ассемблеру, что за указанной директивой будет следовать набор байт.
- ret (от англ. «return») — команда, обозначающая выход из функции (синоним функции — процедура). Наша программа фактически является одной функцией. В модели файла типа COM ret необходима для возврата в DOS.
Между метками start и message мы видим исполняемый код программы. Он состоит из ассемблерных команд. Продолжим анализ программного кода и разберём эти команды.
Код.
Прерывание DOS — это сигнал процессору немедленно осуществить определённые действия. Прерывания бывают аппаратными и программными. Программное прерывание — это практически функция, имеющая определённые параметры (обработчик прерывания). После выполнения функции обработчика прерывания, код выполняется далее.
1 2 3 | mov ah,9 mov dx,offset message int 21h |
Фактически мы видим вызов системной функции с параметрами. Что такое системная функция? Системная функция — это часть системы — код, встроенный в систему. Манипулируя с системными функциями можно упростить написание собственного кода. В этом есть один минус — код получается системозависимый. Но в реальности большинство программ пишутся под конкретные операционки, поэтому этот «минус» можно не принимать во внимание.
- int 21h — так называемое «прерывание 21h» (фактически — это системные функции MS-DOS). При этом функция вызывается с помощью директивы int — «interupt» и номера конкретной функции, помещенного до вызова прерывания в ah (mov ah,9).
- AH — это «верхняя» часть регистра AX.
- mov — это команда ассемблера, перемещающая в конкретный регистр либо блок данных определённое значение. В данном случае, в верхнюю часть регистра ax (ah) перемещается число 9, а в регистр dx перемещается смещение строки байт.
Анализ программного кода нашей первой программы закончен. Скачать TASM и всё необходимое для урока, включая исходники, можно здесь. В следующей статье мы рассмотрим очень важные ключевые понятия, которые необходимы для написания программ на ассемблере.