试图理解未标记的 nasm 伪指令

trying to understand unlabled nasm pseudo-instructions

我是 namn 和汇编的新手,正在阅读手册时遇到以下问题。

试图理解为什么不使用标签就声明伪指令。

是为了对齐数据,还是为什么要这样做?

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

来自NASM Manual

DB、DW、DD、DQ、DT、DO、DY 和 DZ 与在 MASM 中一样,用于声明初始化数据。

db - define a byte
dw - define a word

因为 NASM 源代码行的布局是

label:    instruction operands        ; comment

这就是未标记指令被称为伪指令的原因。

伪指令是汇编程序设计者为了方便内存初始化和space保留而创建的一些特殊指令。这些包含对汇编程序本身的命令。

section .data
    db    0x01,0x02,0x03,0x04    ; Initialize 4 bytes to 1h, 2h, 3h, 4h
    dw    0x1234                 ; Initialize 1 word (2 bytes) to 1234h

一般来说,做一些类似于 C 结构的东西。
考虑与 INT13/AH=42h.

一起使用的 Disk Address Packet 结构
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 00hDefaultDAP 的位置发出。

发射数据通常很有用,即使对于生成代码也是如此。您始终可以使用相对寻址来访问数据,因此实际上可以避免很多标签,但这会使代码变得糟糕且效率低下(因为汇编程序可以为您计算偏移量)。