当我查看下面的代码时,我觉得很奇怪。第一条指令显然已经完成了数据传输和扩展为16位的任务。为什么汇编代码中有“mov Eax,ax”?
movzx eax, word ptr [rbp+addr.sa_data]
movzx eax, ax
mov edi, eax
call _htons
当我查看下面的代码时,我觉得很奇怪。第一条指令显然已经完成了数据传输和扩展为16位的任务。为什么汇编代码中有“mov Eax,ax”?
movzx eax, word ptr [rbp+addr.sa_data]
movzx eax, ax
mov edi, eax
call _htons
显然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++ 产生相同的结果。此外,它仅在从结构中读取值时发生。