NASM說明書(v2.14.02)翻譯-3.1 NASM代碼行的佈局

Copyright 1996−2017 the NASM Authors – All rights reserved.Redistribution and use in source and binary forms, with or without modification, are permittedprovided that the following conditions are met:
• Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
• Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

跟其他彙編器一樣,每一行NASM的代碼行(除非該行macro、a preprocessor directive 或 assembler directive。參見第四章和第六章)包括以下四部分。

label:    instruction operands        ; comment

這四部分中的大多數是可選的。label、instruction、comment三者都是可選擇,出現一個、出現兩個、或是三者都出現都是被允許的。operands是否出現由instruction決定。

如果代碼行以\結尾,那麼NASM將視爲改行與下一行爲一行代碼。

NASM沒有限制空白的數量,這意味着在labels之前可以有很多空格,也可以沒有。在instruction之前也可以沒有空格。label和instruction之間的冒號也是可選的(注意:這意味着不管有意還是無疑,在一行中如果只出現一個單詞,NASM會認爲這一行只定義了一個label,在彙編時不會出現任何錯誤。但你可以在命令行中使用-w+orphan-labels選項,這時如果NASM發現某行只有一個label且沒有冒號,那麼NASM會發出一個警告)。

在NASM中可以用作定義標識符(identifier)的字符有字母、數字、_$#@~.、和?。其中只有字母、._?可以作爲第一個字符。標識符也可以以$作爲前綴,這樣可以將它與保留字區分開。比如eax是一個保留字代表一個寄存器,而$eax則代表一個叫eax的普通的標識符而不是寄存器。標識符的 最大長度爲4095個字符。

instruction部分可以是任何機器指令:Pentium P6指令 FPU指令 MMX指令 甚至是沒有被明確的指令都支持。這些指令可以使用以下前綴LOCK, REP, REPE/REPZ,REPNE/REPNZ,XACQUIRE/XRELEASE和BND/NOBND。也可以使用A16, A32,A64, O16 和 O32, O64和前綴來顯示地指定地址和操作數大小,可以在第十章看到例子。你也可以使用段寄存器作爲前綴,如es mov [bx], ax效果等同於mov [es:bx],ax。但建議使用後者,因爲它更符合通常的語法。但對於想lodsb這種沒有參數但又允許改變段的指令,沒有其他辦法只能使用es lodsb

可以在沒有指令的前提下使用前綴。CS, A32, LOCK 或REPE這些前綴都可以獨立的成爲一行。NASM會生成前綴字節。

除了機器指令外,NASM還支持一定數量的僞指令,將在3.2節中討論。

instruction的operands的形式可以是:寄存器名稱(如:ax,bp,ebx,cr0,NASM與gas不同寄存器名字不需要加前綴%)、有效地址(見3.3章)、常數(見3.4章)、表達式(見3.5章)

對於x87浮點數指令,NASM接受一個寬泛的語法格式:可以使用類似MASM語法的雙operand形式。在大多數情況下也可以使用NASM單operand形式。

        fadd    st1             ; this sets st0 := st0 + st1 
        fadd    st0,st1         ; so does this 

        fadd    st1,st0         ; this sets st1 := st1 + st0 
        fadd    to st1          ; so does this

幾乎所有的x87浮點數指針指令,都必須使用前綴 DWORD, QWORD 或 TWORD來表明它指向內存的大小。

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