在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指令变得多余了吗?
我发现了一些类似的问题,但没有一个问题有多大帮助.struct name是指向struct的第一个元素的指针,类似于数组吗?
struct example {
int foo;
int bar;
};
struct example e;
e.foo = 5;
e.bar = 10;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", e, e.foo, e.bar, &e, &e.foo, &e.bar);
Run Code Online (Sandbox Code Playgroud)
输出:
5
5
10
2033501712
2033501712
2033501716
Run Code Online (Sandbox Code Playgroud)
其他问题的所有答案都说"不",但这个输出让我感到困惑.非常感谢所有的帮助.