Ассемблер с нуля. Часть 7. Анализ кода.

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 и всё необходимое для урока, включая исходники, можно здесь. В следующей статье мы рассмотрим очень важные ключевые понятия, которые необходимы для написания программ на ассемблере.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *