间接寄存器寻址

时间:2014-12-11 06:17:06

标签: unix assembly nasm addressing-mode

我试图找出寄存器间接寻址的工作原理。我有一个变量存储值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]完成的,但我的代码似乎不起作用。任何关于语法的帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

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

您可以使用某个寄存器来暂时保存值[eax]

mov eax, number
mov dl, [eax]
mov [number2], dl

答案 1 :(得分:1)

问题在于,numbernumber2不是数字,即直接文字。相反,它们被解释为绝对存储器地址和相应的指令,如果它们存在则会是这样的。

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

一个人必须注意指令格式,正如Mika Lammi所回答 - 是指令

 mov src, dst   ;; vs
 mov dst, src

此外,应该将寄存器大小与可变大小匹配;即

.data
number   db 1;   // this is a byte
.code
mov al, number