我试图找出寄存器间接寻址的工作原理。我有一个变量存储值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]完成的,但我的代码似乎不起作用。任何关于语法的帮助都将非常感激。
答案 0 :(得分:1)
标签在nasm中用作地址,因此mov number2, [eax]
会转换为类似mov 0x12345678, [eax]
的内容,这当然是无效的,因为您无法将数据移动到直接操作数。所以你需要mov [number2], [eax]
,但这也是无效的。
您可以使用某个寄存器来暂时保存值[eax]
:
mov eax, number
mov dl, [eax]
mov [number2], dl
答案 1 :(得分:1)
问题在于,number
和number2
不是数字,即直接文字。相反,它们被解释为绝对存储器地址和相应的指令,如果它们存在则会是这样的。
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