0

我试图弄清楚寄存器间接寻址是如何工作的。我有一个存储 5 值的变量,如下所示:

section .data

number db 53 ; ascii code for 5

section .bss
number2 resb 1
section .text
global _start

_start:

mov eax,number
mov number2,[eax]

在代码的最后两行,我实际上想要做的是让 eax 充当指向存储在 number 的数据的指针,然后将这些数据移动到 number2 变量中。我虽然间接寄存器寻址是通过 [register] 完成的,但我的代码似乎不起作用。任何有关语法的帮助将不胜感激。

4

2 回答 2

1

标签在 nasm 中用作地址,因此您mov number2, [eax]将转换为mov 0x12345678, [eax]当然无效的内容,因为您无法将数据移动到立即操作数。所以你需要mov [number2], [eax],但这也是无效的。

您可以使用一些寄存器来临时保存该值来实现这一点[eax]

mov eax, number
mov dl, [eax]
mov [number2], dl
于 2014-12-11T06:38:22.020 回答
1

这里的问题是,number并且number2不是数字,即直接文字。相反,它们被解释为绝对内存地址和相应的指令,如果它们存在的话,例如

 mov eax, [0x80000100]        ;; vs
 mov [0x80000104], [eax]     ;; Invalid instruction

正如 Mika Lammi 所回答的那样,还必须注意指令格式 - 是指令

 mov src, dst   ;; vs
 mov dst, src

此外,应该将寄存器大小与变量大小相匹配;IE

.data
number   db 1;   // this is a byte
.code
mov al, number
于 2014-12-11T06:46:32.427 回答