[英]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.