MOVZX EAX,AX 在 MOVZX EAX, WORD PTR [RBP+ADDR.SA_DATA] 之后的用途是什么?

逆向工程 艾达 部件 x86
2021-06-24 15:37:22

当我查看下面的代码时,我觉得很奇怪。第一条指令显然已经完成了数据传输和扩展为16位的任务。为什么汇编代码中有“mov Eax,ax”?

    movzx   eax, word ptr [rbp+addr.sa_data]
    movzx   eax, ax
    mov     edi, eax
    call    _htons
1个回答

显然movzx eax, ax是没用的。我会说这是未优化的代码,此 C 代码可以重现相同的生成代码。

#include <stdint.h>

void f(uint16_t v)
{
}

struct S
{
        uint16_t a;
};

int main(void)
{
        struct S s;
        s.a = 0x1122;
        f(s.a);
        return 0;
}

不带优化选项的gcc编译,代码为:

1134:       0f b7 45 fe             movzx  eax,WORD PTR [rbp-0x2]
1138:       0f b7 c0                movzx  eax,ax
113b:       89 c7                   mov    edi,eax
113d:       e8 d7 ff ff ff          call   1119 <f>

请注意,我无法使用 clang 或 vc++ 产生相同的结果。此外,它仅在从结构中读取值时发生。