Ассемблирование файла hello1.asm в hello1.com
nasm -f bin hello1.asm -o hello1.comСм. также
Информация об ассемблере
| Модель | Тип кода | Тип данных | Назначение модели |
|---|---|---|---|
| TINY | near | near | Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .com |
| SMALL | near | near | Код занимает один сегмент, данные объединены в одну группу с имепем DGROUP. Эту модель обычно используют для большинства программ на ассемблере |
| MEDIUM | far | near | Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления - типа far. Данные объединены в одной группе; все ссылки на них - типа near. |
| COMPACT | near | far | Код в одном сегменте; ссылка на данные - типа far. |
| LARGE | far | far | Код в нескольких сегментах, по одному на каждый объединяемый программный модуль. |
| STACKSEG SEGMENT PARA STACK ‘STACK’ |
DB 256 DUP(?)
STACKSEG ENDS
Разбор кода
Директивы - отвечают за инициализацию программы
.CODE - начинает сегмент кода, где находится блок команды
.STARTUP - генерирует код, выполняющий установку сегментных регистров и подготовку стека. В числе прочих действий указывает компилятору ( TOBO ), что загружать программу следует со смещения (конкретно для этого действия есть аналог - команда ORG 100h). Если это не будет указано тем или иным способом, то при выполнении программы смещение будет вычисляться относительно 0 - что неизбежно приведёт к некорректному поведению.
- Зачем нужна директива
.MODEL TINY? - Что делает директива
.DOSSEG? Почему она используется в этом коде? Что произойдет, если ее убрать?
Работа с отладчиком
Перемещение между консолью и отладчиком:
mo a onв строке команды- Для перемещения между консолью и отладчиком используем 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] | Очистка строки |
-20250607194605039.webp)
AAAAAAAAAAAAAAAAAAAA00000000000000000000
16348072326527006286543801260232210143772672
-20250608011254739.webp)