僞指令(pseudo-instructions)是指那些並不是x86機器指令但是需要寫在代碼中的instruction位置的東西。目前支持僞指令有數據初始化指令DB, DW, DD, DQ,DT, DO, DY 和 DZ;數據不初始化指令 RESB,RESW,RESD, RESQ, REST, RESO,RESY 和 RESZ;INCBIN命令;EQU命令;TIMES前綴。
3.2.1 BD族僞指令:聲明初始化的數據
DB, DW, DD, DQ,DT, DO, DY 和 DZ的使用方式與其在MASM中的使用方式一致,用於在輸出文件中聲明初始化後的數據。有多種調用他們的方式:
db 0x55 ;聲明一個值爲0x55的byte
db 0x55,0x56,0x57 ; 連續聲明三個byte
db 'a',0x55 ; 使用字符常數也是可以的
db 'hello',13,10,'$' ; 使用字符串常量也是可以的
dw 0x1234 ; 0x34 0x12
dw 'a' ; 0x61 0x00
dw 'ab' ; 0x61 0x62
dw 'abc' ; 0x61 0x62 0x63 0x00
dd 0x12345678 ; 0x78 0x56 0x34 0x12
dd 1.234567e20 ; 單精度浮點數常量
dq 0x123456789abcdef0 ; 八字節常量
dq 1.234567e20 ; 雙精度浮點數
dt 1.234567e20 ;擴展精度浮點數
DT, DO, DY 和 DZ 不接受數字常數作爲操作數。
3.2.2 RESB族僞指令:聲明不初始化的數據
RESB, RESW, RESD,RESQ, REST, RESO, RESY 和 RESZ 被用在模塊的BSS段中。它們聲明一塊存儲空間,而這塊存儲空間不會被初始化。使用時需要指定一個操作,這個操作數是預保留的存儲空間大小,單位分別爲byte,word,doubleword等。正如在2.2.7節所述,NASM不支持 MASM或TASM聲明不初始化數據的語法,如:DW ?
。
The operand to a RESB–type pseudo-instruction is acritical expression: see section 3.8. 暫時不知道什麼意思。
buffer: resb 64 ; 預留64個byte
wordvar: resw 1 ; 預留1個word
realarray resq 10 ; 長度爲10的實數數組
ymmval: resy 1 ; 一個YMM寄存器
zmmvals: resz 32 ; 32個ZMM寄存器
3.2.3 INCBIN:引入外部二進制文件
INCBIN
是借鑑了古老的Amiga彙編器:使用它可以在輸出文件中直接進入外部二進制文件的內容。如,可以將圖像或聲音數據直接插入遊戲的可執行文件中。有以下三種調用方式:
incbin "file.dat" ; 引入整個文件
incbin "file.dat",1024 ; 跳過開始的1024個字節
incbin "file.dat",1024,512 ; 跳過開始的1024個字節,最多引入512個字節。
INCBIN
既是指令又是標準宏;標準宏版本在文件搜索目錄中搜索文件,並將文件加入到依賴列表中。如果需要,可以覆蓋此宏。
3.2.4 EQU:定義常量
EQU
用於給常量定義一個符號。使用EQU
時,代碼行中必須包含label。EQU會將label名稱定義成給定的操作數的值,EQU只有一個操作數。定義是絕對的,並且不能被修改的,如:
message db 'hello, world'
msglen equ $-message
msglen
被定義成12。msglen
之後不能再被重新定義。這也不是預處理定義,因爲msglen
和$
的值是隻通過一次計算獲得的,而不是在每次引用它們的地方都計算一次。關於$
的說明參見3.5節。
3.2.5 TIMES:重複Instruction或Data
TIMES
會使指令被彙編多次。使用TIMS
部分原因是NASM不支持MASM的DUP
語法,你可以使用類似以下方式代替MASM的DUP
語法。
zerobuf: times 64 db 0
TIMES
的作用不僅如此。TIMES
的操作數不僅可以是常數,還可以是表達式。
buffer: db 'hello, world'
times 64-$+buffer db ' '
以上代碼可以將buffer預留的空間擴展到64btye,並且在hello,world
之後的填充空格。最後TIMES
可以用來允許地重複指令,因此可以使用它簡化某些循環操作:
times 100 movsb
注意times 100 resb 1
和resb 100
在最終效果上沒有區別,但在彙編階段NASM處理後者會更快一些。
The operand to TIMES is a critical expression(section 3.8). 不知道什麼意思。暫不翻譯
另外注意TIMES不能用於宏。原因在於TIMS的處理在宏處理之後。如果只是想單純重複代碼行,或者重複一個複雜的宏,可以使用預處理指令-%rep