试图理解未标记的 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 00h
在 DefaultDAP
的位置发出。
发射数据通常很有用,即使对于生成代码也是如此。您始终可以使用相对寻址来访问数据,因此实际上可以避免很多标签,但这会使代码变得糟糕且效率低下(因为汇编程序可以为您计算偏移量)。
我是 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
.
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
的位置发出。
发射数据通常很有用,即使对于生成代码也是如此。您始终可以使用相对寻址来访问数据,因此实际上可以避免很多标签,但这会使代码变得糟糕且效率低下(因为汇编程序可以为您计算偏移量)。