2015-06-24 20 views
2

我是namn和assembly的新手,正在閱讀手冊,當時我被困在以下內容中。試圖理解非標準的nasm僞指令

試着明白爲什麼要聲明不使用標籤的僞指令。

它對齊數據,或爲什麼會這樣做?

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

「聲明僞指令」?所有這些都是將6個字節的數據放在'.data'部分。 – Michael

+0

以及nasm doc將它們稱爲僞指令(DB,DW,DD,DQ,DT,DO,DY和DZ),是的,我知道我們在數據部分放置了6個字節。但我的問題是爲什麼會這樣做。還是我的問題不清楚? – mutiju

+2

也許代碼的某些部分是指它們相對於'.data'節的開頭部分。或者,在某些情況下(這裏沒有說明是這種情況),您可能希望將特定數據作爲某種頭部的某種位置,而您真的不關心是否能夠從代碼中引用該數據。 – Michael

回答

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位置發出的。

發射數據通常很有用,即使是生成代碼也是如此。你總是可以使用相對尋址來訪問數據,所以實際上可以避免很多標籤,但這會使代碼變得很糟糕並且效率較低(因爲彙編器可以爲你計算偏移量)。

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