我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":
mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:
mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在x86中何时使用大小指令似乎有点模棱两可。此x86组装指南中的内容如下:
通常,可以从引用该数据项的汇编代码指令中推断出该数据项在给定存储地址处的预期大小。例如,在所有上述指令中,可以从寄存器操作数的大小推断出存储区域的大小。当我们加载32位寄存器时,汇编程序可以推断出我们所指的内存区域为4字节宽。当我们将一个字节的寄存器的值存储到内存中时,汇编程序可以推断出我们希望地址引用内存中的单个字节。
他们给出的例子很简单,例如将立即数移到寄存器中。
但是,如何处理更复杂的情况,例如:
mov QWORD PTR [rip+0x21b520], 0x1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,QWORD PTR size指令不是多余的,因为根据上述指南,可以假定由于RIP为8字节,所以我们要将8字节移入目标寄存器吗?x86体系结构上的size指令的最终规则是什么?谢谢,我在任何地方都找不到答案。
更新:正如罗斯指出,以上示例中的目的地不是寄存器。这是一个更相关的示例:
mov esi, DWORD PTR [rax*4+0x419260]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不能假设由于ESI为4个字节而要移动4个字节,从而使DWORD PTR指令变得多余了吗?