首页 > 解决方案 > 为什么 C++ 使用 32 位寄存器存储 8 位值

问题描述

我尝试了以下 C++ 代码:

void foo( ) {
    char c = 'a';
    c = c + 1;
}

得到以下结果x86-64 gcc 10.1 default flags

    mov     BYTE PTR [rbp-1], 97
    movzx   eax, BYTE PTR [rbp-1]  ; EAX here
    add     eax, 1
    mov     BYTE PTR [rbp-1], al

但!得到以下结果x86-64 djgpp 7.2.0 default flags

    mov     BYTE PTR [ebp-1], 97
    mov     al, BYTE PTR [ebp-1] ; AL here
    inc     eax
    mov     BYTE PTR [ebp-1], al

为什么 GCC 使用EAX而不是AL

为什么 djgppAL只使用?

是性能问题吗?

如果是这样,将 32 位寄存器用于 8 位值会导致什么样的性能问题?

标签: c++assemblygccx86cpu-registers

解决方案


在 AMD 和最近的 Intel 处理器上,加载部分寄存器需要整个寄存器的先前值,以便将其与加载的值组合以产生新的寄存器值。

如果写入完整的寄存器,则不需要旧值,因此,通过寄存器重命名,可以在寄存器的先前写入之前完成。


推荐阅读