assembly 错误:非64位模式中的操作数无效

yfwxisqw  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(144)

我尝试运行此代码并打印结果,但由于某种原因,我收到以下错误消息:

main.asm:10: error: invalid operands in non-64-bit mode 
main.asm:11: error: invalid operands in non-64-bit mode
main.asm:12: error: invalid operands in non-64-bit mode
main.asm:13: error: invalid operands in non-64-bit mode
ld: cannot find *.o: No such file or directory

这是代码:

global _start       
section .data
    n DB 10
section .text
_start:
    xor ax, ax
    mov bx, 1
    mov cx, (n)
.L1:
    mov r9w, bx    #one of the lines that leads to an error
    imul r9w, bx   #one of the lines that leads to an error
    imul r9w, bx   #one of the lines that leads to an error
    add ax, r9w    #one of the lines that leads to an error
    inc bx
    dec cx
    test cx, cx
    jne .L1
    
    movq rax, 1
    movq rdi, 1
    movq rsi, ax
    movq rdx, 8
    syscall

    xor rax, rax
    ret
END:

我是一个相当新的组装,不能完全理解问题是什么-BX寄存器是16位,R9 W也是16位...
我使用在线编译器来运行这个(https://www.tutorialspoint.com/compile_assembly_online.php

zd287kbt

zd287kbt1#

我发现您的代码存在三个主要问题:
1.您正试图在非64位模式下访问64位寄存器。尽管R9W是R9寄存器的最低部分,但它仍仅为64位模式。
1.您正试图通过执行ret指令从 _start 返回。这可能会导致段错误,因为堆栈当前包含指向argc的指针
1.您可能应该使用mov指令,而不是movq指令。

相关问题