попытка понять неблокируемые псевдо-инструкции nasm


Я новичок в namn и сборке и просматривал руководство, когда я застрял на следующем.

Попытка понять, почему можно объявлять псевдоинструкции без использования меток.

Нужно ли выравнивать данные, или зачем это делать?

section .data
    db    0x01,0x02,0x03,0x04
    dw    0x1234               
2 2

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