NASM說明書(v2.14.02)翻譯-3.2 僞指令

僞指令(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 1resb 100在最終效果上沒有區別,但在彙編階段NASM處理後者會更快一些。

The operand to TIMES is a critical expression(section 3.8). 不知道什麼意思。暫不翻譯

另外注意TIMES不能用於宏。原因在於TIMS的處理在宏處理之後。如果只是想單純重複代碼行,或者重複一個複雜的宏,可以使用預處理指令-%rep

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章