簡體   English   中英

為什么NA​​SM在有效的指令助記符作為操作數中的符號名稱時不會遇到麻煩?

[英]Why doesn't NASM have trouble with valid instruction mnemonics as symbol names in operands?

我編寫了以下簡單程序,但是nasm拒絕對其進行編譯。

section .text
    global _start

_start:
    mov rax, 0x01 
    mov rdi, 0x01
    mov rsi, str
    mov rdx, 0x03
    syscall

    mov rax, 60
    syscall

segment .data
    str db 'Some string'


nasm -f elf64 main.asm
main.asm:15: error: comma, colon, decorator or end of line expected after operand

如我在這個答案中所讀,這是因為str是指令助記符。 因此,我在str添加了一個冒號,現在可以正常編譯了。 但是那條線呢

mov rsi, str

str在這里是指令助記符,但仍可以正常編譯。 為什么?

NASM手冊所述 ,除了宏定義和指令外,NASM源代碼行的格式還具有以下四個字段的組合:

label:    instruction operands        ; comment

在將mov視為助記符后,便不再將其余標記視為可能的指令助記符。 匯編語言嚴格來說是每個語句一個指令。

如果您希望將編碼str ax指令的字節作為mov -sign-extended-imm32的立即操作數,則必須自己使用數字常量來完成。 NASM語法沒有為您完成此操作的方法,因此,一旦找到助記符,其解析器就無需遞歸到操作數中。


或者,也可以使用db發出mov指令的字節,而不是手動編碼str

db 0x48, 0xc7, 0xc6    ; REX.W prefix, opcode for mov r/m64,imm32,  ModR/M = rsi destination
      str  [rax+1]     ; a disp8 makes this 4 bytes long.


;; same machine code as
mov rsi, strict dword 0x0148000f    ; str [rax+1]

;; nasm optimizes it to mov esi, imm32 without strict dword.
;; I guess I should have used that 5-byte instruction for the DB version...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM