【问题标题】:x64 OSX Assembly MOVx64 OSX 程序集 MOV
【发布时间】:2014-11-13 01:21:54
【问题描述】:

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

【问题讨论】:

  • 第 32 行是哪一行?
  • 对不起!它是 'mov tmp, rax'

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


【解决方案1】:

mov tmp, rax 是非法的,因为 nasm 需要在内存操作数周围加上方括号 []。因此,您想要的是mov [tmp], rax。这当然在 nasm 手册中提到,请参阅恰当命名为 NASM Requires Square Brackets For Memory References 的部分。

但请注意,rax 是 64 位,即 8 个字节,而您在 tmp 处仅保留了 1 个字节。在这种情况下,这可能会起作用,因为在.bss 中的tmp 之后似乎没有什么重要的东西,并且页面大小对您有利,因此您可能有空间容纳额外的 7 个字节。尽管如此,您确实应该保留尽可能多的字节数。

【讨论】:

  • 当我执行 'mov [tmp], rax' 时,我得到 'asmtest.asm:32: error: Mach-O 64-bit format does not support 32-bit absolute addresses'
  • 使用 mov [rel tmp], rax 让 nasm 为您生成 rip-relative 编码,或者在您的文件顶部插入 default rel 以便它自动为所有内存操作数执行此操作。
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多