错误:地址大小的不可能组合

dro*_*oob 1 assembly x86-64 nasm

我正在尝试学习如何使用汇编语言来改变牌组.我精通java,我可以很容易地将java翻译成C,但我在ASM上遇到了困难.这是我现在遇到的代码块:

MOV R8, [RDI+RSI*4]

MOV R9, [RDI+RDX*4]

MOV  [RDI+RSI*4], R9

MOV  [RDI+RDX*4], R8
Run Code Online (Sandbox Code Playgroud)

我一直在

error: impossible combination of address sizes
Run Code Online (Sandbox Code Playgroud)

它是用命令运行的

nasm -f elf FILE-NAME.asm
Run Code Online (Sandbox Code Playgroud)

我猜它与我正在使用的寄存器有问题,但我不知道汇编中的规则.我正在学习使用tutorialspoint但是如果有人对其他地方有任何建议我可以更好地学习它,这将是有帮助的.我也在这个答案上看到所有使用的寄存器都有相同的大小,为什么会出错呢?

tha*_*guy 6

您正在编写64位代码,但您的-f elfNASM将处于32位模式.elf64改为使用:

$ cat foo.asm
MOV R8, [RDI+RSI*4]

$ nasm -f elf foo.asm
foo.asm:1: error: impossible combination of address sizes

$ nasm -f elf64 foo.asm
(no output)
Run Code Online (Sandbox Code Playgroud)

  • 或者更好,`nasm -f elf64`. (2认同)