Ассемблирование файла hello1.asm в hello1.com

nasm -f bin hello1.asm -o hello1.com

См. также

Информация об ассемблере

  1. Сегменты памяти
МодельТип кодаТип данныхНазначение модели
TINYnearnearКод и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .com
SMALLnearnearКод занимает один сегмент, данные объединены в одну группу с имепем DGROUP. Эту модель обычно используют для большинства программ на ассемблере
MEDIUMfarnearКод занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления - типа far. Данные объединены в одной группе; все ссылки на них - типа near.
COMPACTnearfarКод в одном сегменте; ссылка на данные - типа far.
LARGEfarfarКод в нескольких сегментах, по одному на каждый объединяемый программный модуль.
STACKSEG SEGMENT PARA STACK ‘STACK’
DB 256 DUP(?)

STACKSEG ENDS

Разбор кода

Директивы - отвечают за инициализацию программы .CODE - начинает сегмент кода, где находится блок команды .STARTUP - генерирует код, выполняющий установку сегментных регистров и подготовку стека. В числе прочих действий указывает компилятору ( TOBO ), что загружать программу следует со смещения (конкретно для этого действия есть аналог - команда ORG 100h). Если это не будет указано тем или иным способом, то при выполнении программы смещение будет вычисляться относительно 0 - что неизбежно приведёт к некорректному поведению.

  1. Зачем нужна директива .MODEL TINY?
  2. Что делает директива .DOSSEG? Почему она используется в этом коде? Что произойдет, если ее убрать?

Работа с отладчиком

Перемещение между консолью и отладчиком:

  1. mo a on в строке команды
  2. Для перемещения между консолью и отладчиком используем f6

AX, BX, CX, DX - регистры общего назначения IP - указатель на номер байта, с которого начинается следующая команда. Изменять не можем - изменяется автоматически Flags - регистр флагов (слово, каждый бит имеет определённый смысл). ZF (Zero Flag) - устанавливается в 1, когда в предыдущей арифметической операции был получен 0. CF - флаг переноса - устанавливается, когда в результате предыдущей операции произошло, например, переполнение. Подробнее о файлах - страницы 23-24 [[Библиотека/2000_Assembler_для_DOS,Windows_и_UNIX•_Зубков_С_C3972EED.pdf|учебника Зубкова]].

a 200 - переход к строке 200 m1 100 - в области памяти 1 показываются ячейки памяти, начиная с 100 m2 120 - в области памяти 2 показываются ячейки памяти, начиная со 120 f 120, 10, 54 - заполняем ячейку памяти 120 значением 54 (10 раз) w 120,10,22.txt - записываем в файл 22.txt l /100 22.txt - читаем данные файла 22.txt, данные записываются начиная с адреса 100 r ax=1234 - записываем данные в регистр ax r ip=120 - меняем счётчик (ip) a [Press-ENTER] - режим ассемблирования. Можем писать команды и пошагово выполнять их. Выход из режима: Ctrl+Enter.

Калькулятор ? = d + 8 Result: 15 (в 16-ричной системе счисления) ? % = d + 8 Result: 21 (в 10-тичной системе счисления) ? = % 50 Result: 32 (в 16-ричной системе счисления)

Загрузка asm-программы l \100 hello.com - загружаем программу hello.com, начиная с адреса 100

Команды в режиме ассемблирования

inc axИнкремент регистра ax
dec axДекремент регистра ax
mov ax, [val]Помещает в ax значение val
add ax, bxДобавляет к значению регистра ax значение регистра bx
sub ax, bxДобавляет к значению регистра bx значение регистра ax
[Press-Enter]Очистка строки

AAAAAAAAAAAAAAAAAAAA00000000000000000000

16348072326527006286543801260232210143772672