x64 OSX Assembly MOV

时间:2014-11-13 01:21:54

标签: macos assembly 64-bit nasm x86-64

我正在使用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

1 个答案:

答案 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个字节的空间。不过,您应该保留尽可能多的字节数。