小编Hel*_*llo的帖子

什么时候应该在x86中使用大小指令?

在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指令变得多余了吗?

x86 assembly x86-64

5
推荐指数
2
解决办法
1467
查看次数

struct name是否指向第一个元素?

我发现了一些类似的问题,但没有一个问题有多大帮助.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)

其他问题的所有答案都说"不",但这个输出让我感到困惑.非常感谢所有的帮助.

c struct pointers

2
推荐指数
1
解决办法
2417
查看次数

标签 统计

assembly ×1

c ×1

pointers ×1

struct ×1

x86 ×1

x86-64 ×1