【发布时间】:2018-07-05 02:42:36
【问题描述】:
我在想象数据如何进入 RAX 寄存器时遇到了一些麻烦。
这里是汇编语言:
.data
dwordVal DWORD 94326732h
.code
mov rax, 0FFFFFFFF00000000h
mov rax, dwordVal
我了解到您无法使用 MOV 将较小的操作数移动到较大的操作数中。在我看来,dwordVal 只会填充 64 位 rax 寄存器的下半部分,所以这是不允许的。如果我错了,请纠正我。
【问题讨论】:
-
如果您使用的汇编程序将
dwordVal视为内存引用,那么mov将无意识地加载 64 位,即使您只定义了 32 位数据。如果您的汇编程序将其用作地址,那么当然你只是加载一个 64 位地址就可以了。 -
所以第一个 mov 操作初始化 rax 寄存器,如果我理解正确,第二个 mov 填充下半部分
-
你应该经常在调试器中尝试这些东西。例如,如果您要定义
dwordVal DWORD 94326732h, 0deadf00dh并执行mov rax, dwordVal,则根据您的汇编程序,rax将包含94326732h值的第一个字节的地址,或来自内存0deadf00d94326732h的qword 值(两个双字都已加载),两者都明显不同意你最初的想法。在单步执行指令时在调试器中观察事物通常是最好的第二知识来源(在阅读指令参考指南中的纯理论之后)。
标签: assembly x86-64 cpu-registers