我正在使用NASM学习x64 ASM。我收到操作码和操作数错误。我找不到任何真正好的文档。很难找到足以解释它的文档。
; nasm/nasm -f macho64 -o asmtest.o asmtest.asm && ld -macosx_version_min 10.7.0 asmtest.o -o asmtest && ./asmtest
;
; External
;
; none
; Define
;
%define SYSCALL_WRITE 0x2000004
%define SYSCALL_EXIT 0x2000001
; Data
;
section .data
text db "Hi.", 0xA
textlen equ $ - text
section .bss
tmp resb 1
; Code
;
section .text
global start
start:
mov rax, 1
mov tmp, rax
call write
write:
mov rax, SYSCALL_WRITE
mov rdi, 1
mov rsi, text
mov rdx, textlen
syscall
call exit
exit:
mov rax, SYSCALL_EXIT
mov rdi, 1
syscall
我收到的错误是
asmtest.asm:32: error: invalid combination of opcode and operands
答案 0 :(得分:3)
mov tmp, rax
是非法的,因为nasm需要围绕内存操作数的方括号[]
。因此,您想要的是mov [tmp], rax
。这当然在nasm手册中提到,请参阅名为NASM Requires Square Brackets For Memory References的部分。
但是请注意,rax
是64位,意味着8个字节,并且您只在tmp
保留了1个字节。在这种情况下可能会有效,因为在tmp
.bss
之后似乎并不重要,并且页面大小对您有利,因此您可能有额外7个字节的空间。不过,您应该保留尽可能多的字节数。