попытка понять неблокируемые псевдо-инструкции nasm
Я новичок в namn и сборке и просматривал руководство, когда я застрял на следующем.
Попытка понять, почему можно объявлять псевдоинструкции без использования меток.
Нужно ли выравнивать данные, или зачем это делать?
section .data
db 0x01,0x02,0x03,0x04
dw 0x1234
2 ответа:
В общем, сделать что-то похожее на C structs.
Рассмотрим эту структурупакета адреса диска , используемую сINT13/AH=42h
.Offset Size Description (Table 00272) 00h BYTE size of packet (10h or 18h) 01h BYTE reserved (0) 02h WORD number of blocks to transfer (max 007Fh for Phoenix EDD) 04h DWORD -> transfer buffer 08h QWORD starting absolute block number
Функция для установки буфера передачи может быть:
push bp mov bp, sp mov bx, WORD [bp+04] ;Address of struct base mov ax, WORD [bp+06h] ;Tx offset mov WORD [bx+04h], ax mov ax, WORD [bp+08h] ;Tx segment mov WORD [bx+06h], ax pop bp ret 06h
Эта функция использует относительную адресацию для задания полей структур, таким образом, она работает с каждой структурой независимо от того, как она была выделена.
В вашей программе эти структуры распределяются динамически, поэтому вам не нужно определять их в разделе данных, но один статически выделяется по какой-то причине.
Это можно определить какDefaultDAP: db 18h db 00h dw 1 dd 0 dd 0
Нет необходимости называть каждое поле, поскольку вышеупомянутая функция не использует метку (но относительную адресацию), значение имеет то, что
18h 00h 01h 00h 00h 00h 00h 00h 00h 00h 00h 00h
испускается в местоположенииDefaultDAP
.Излучение данных полезно в целом, даже для генерации кода. Вы всегда можете использовать относительную адресацию для доступа к данным, поэтому на самом деле можно избежать большого количества меток, но это сделает код ужасным и менее эффективным (как ассемблер может вычислить смещение для вас).
Из руководства NASM:
DB, DW, DD, DQ, DT, DO, DY и DZ используются, как и в MASM, для объявления инициализированных данных.
db - define a byte dw - define a word
Поскольку расположение исходной строки NASM равно
label: instruction operands ; comment
Это почему инструкции немаркированных называются инструкции псевдо.
Псевдо-инструкции - это некоторые специальные инструкции, созданные дизайнером ассемблера для облегчения главным образом инициализации памяти и резервирования пространства. Они содержат команды для сам ассемблер.
section .data db 0x01,0x02,0x03,0x04 ; Initialize 4 bytes to 1h, 2h, 3h, 4h dw 0x1234 ; Initialize 1 word (2 bytes) to 1234h