我想替换整数中的最低字节.在x86上,这个值正好是mov al, [mem]
,但是我似乎无法让编译器输出这个值.我是否遗漏了可以识别的明显代码模式,或者我误解了什么,或者这仅仅是遗漏了一个优化?
unsigned insert_1(const unsigned* a, const unsigned char* b)
{
return (*a & ~255) | *b;
}
unsigned insert_2(const unsigned* a, const unsigned char* b)
{
return *a >> 8 << 8 | *b;
}
GCC实际上用的是al
,但只是用来归零.
mov eax, DWORD PTR [rdi]
movzx edx, BYTE PTR [rsi]
xor al, al
or eax, edx
ret
Clang几乎逐字编译了这两个文件
mov ecx, -256
and ecx, dword ptr [rdi]
movzx eax, byte ptr [rsi]
or eax, ecx
ret