试图理解unlabled nasm伪指令

时间:2015-06-24 09:10:52

标签: assembly nasm

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

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

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

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

2 个答案:

答案 0 :(得分:1)

一般来说,要制作类似于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。 / p>

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

答案 1 :(得分:0)

来自NASM Manual

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