MS-DOS и TASM 2.0. Часть 4. Анализ кода.

Анализ программного кода.

Анализ программного кода «Hello World!» на ассемблере.MS-DOS и TASM 2.0

Проведем анализ программного кода нашей первой программы на ассемблере.

Вид строки программного кода.

Программа на языке ассемблера состоит из строк, имеющих следующий вид:

метка команда(директива) операнды ;комментарий

Любое из этих полей необязательно.

Метка может быть любой комбинацией букв английского алфавита, цифр и символов _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие можно включить командной строкой ассемблера.

Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера.

В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву).

В поле комментариев, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно — текст от символа «;»
до конца строки не анализируется ассемблером.

Метки и директивы.

  • TINY определяет модель памяти файлов типа СОМ, в которой сегменты кода, данных и стека объединены.
  • Директива .CODE обозначает начало сегмента кода. Для нашей модели памяти в этом сегменте будут находится также и данные.
  • ORG 100h — смещение в памяти, куда проецируется программа типа СОМ. «H» — обозначает, что число в шестнадцатеричной системе счисления(в десятеричной системе — это 256). Первые 256 байт (100h) используются операционкой.
  • start: — метка перед первой командой программы. Метка может иметь практически любое название (с определёнными исключениями — нельзя использовать имена, включённые в ассемблер). Например, можно «begin_1:», но нельзя «mov:
  • В конце кода мы видим директиву end, после указанной директивы — нашу метку — start. Это обозначает одновременно и
    окончание кода программы и то, что программа начнёт выполняться именно с места, указанного меткой (команда mov ah,9).

Данные.

В этом же сегменте кода, разместились и наши данные:

  • $ — обязательный символ окончания строки для функции вывода текста на экран т.н. терминатор строки (в программировании на Си, в качестве отметки окончания строки используется т.н. «нуль-терминатор» — число 0).
  • 0Dh — код символа ASCII «возврат каретки».
  • 0Ah — код символа ASCII «перевод строки».
  • «Hello World!» — строка с текстом должна быть помещена в двойные или одинарные кавычки.
  • message — метка (всего лишь условное название места расположения строки кода).
  • db — «Define Byte». Даёт понять ассемблеру, что за указанной директивой будет следовать набор байт.
  • ret (от англ. «return») — команда, обозначающая выход из функции (синоним функции — процедура). Наша программа фактически является одной функцией. В модели файла типа COM ret необходима для возврата в DOS.

Между метками start и message мы видим исполняемый код программы. Он состоит из ассемблерных команд. Продолжим анализ программного кода и разберём эти команды.

Код.

Прерывание DOS — это сигнал процессору немедленно осуществить определённые действия. Прерывания бывают аппаратными и программными. Программное прерывание — это практически функция, имеющая определённые параметры (обработчик прерывания). После выполнения функции обработчика прерывания, код выполняется далее.

Фактически мы видим вызов системной функции с параметрами. Что такое системная функция? Системная функция — это часть системы — код, встроенный в систему. Манипулируя с системными функциями можно упростить написание собственного кода. В этом есть один минус — код получается системозависимый. Но в реальности большинство программ пишутся под конкретные операционки, поэтому этот «минус» можно не принимать во внимание.

  • int 21h — так называемое «прерывание 21h» (фактически — это системные функции MS-DOS). При этом функция вызывается с помощью директивы int — «interupt» и номера конкретной функции, помещенного до вызова прерывания в ah (mov ah,9).
  • AH — это «верхняя» часть регистра AX.
  • mov — это команда ассемблера, перемещающая в конкретный регистр либо блок данных определённое значение. В данном случае, в верхнюю часть регистра ax (ah) перемещается число 9, а в регистр dx перемещается смещение строки байт.

Анализ программного кода нашей первой программы закончен. Скачать TASM и всё необходимое для урока, включая исходники, можно здесь. В следующей статье мы рассмотрим очень важные ключевые понятия, которые необходимы для написания программ на ассемблере.

Добавить комментарий