programing

GCC가 변수를 할당하기 전에 임시 위치로 이동하는 이유는 무엇입니까?

powerit 2023. 8. 16. 22:39
반응형

GCC가 변수를 할당하기 전에 임시 위치로 이동하는 이유는 무엇입니까?

일부 디컴파일된 C 코드를 볼 때 다음과 같은 것을 참조하십시오.

movl    -0xc(%rbp), %esi
movl    %esi, -0x8(%rbp)

이는 다음 C 코드에 해당합니다.

x = y;

이것은 저로 하여금 생각하게 했습니다: 어떻게 gcc가 움직일까.y로.%esi그리고 나서 이동.%esi로.x그냥 움직이는 대신에y로.x직접적으로?


이것은 전체 C 및 디컴파일된 코드입니다.

C

int main(void) {
    int x, y, z;

    while(1) {
        x = 0;
        y = 1;
        do {
            printf("%d\n", x);

            z = x + y;
            x = y;
            y = z;
        } while(x < 255);
    }
}

디컴파일됨

pushq    %rbp
movq     %rsp, %rbp
subq     $0x20, %rsp
movl     $0x0, -0x4(%rbp)

movl     $0x0, -0x8(%rbp) ; x = 0
movl     $0x1, -0xc(%rbp) ; y = 1

; printf
leaq     0x56(%rip), %rdi
movl     -0x8(%rbp), %esi
movb     $0x0, %al
callq    0x100000f78

; z = x + y
movl     -0x8(%rbp), %esi  ; x -> esi
addl     -0xc(%rbp), %esi  ; y + esi
movl     %esi, -0x10(%rbp) ; z = esi

; x = y
movl     -0xc(%rbp), %esi
movl     %esi, -0x8(%rbp)

; y = z
movl     -0x10(%rbp), %esi
movl     %esi, -0xc(%rbp)

movl     %eax, -0x14(%rbp) ; not sure... I believe printf return value?
cmpl     $0xff, -0x8(%rbp) ; x < 255
jl       0x100000f3d ; do...while(x < 255)
jmp      0x100000f2f ; while(1)

대부분의 x86 명령어(다음과 같은 일부 특수 명령어 제외)movsb)는 하나의 메모리 위치에만 액세스할 수 있습니다.따라서 메모리에서 메모리로 이동하려면 2개의 레지스터를 통과해야 합니다.mov지침들.

mov명령은 다음과 같은 방식으로 사용할 수 있습니다.

mov mem, reg
mov reg, mem
mov reg, reg
mov reg, imm
mov mem, imm

거기에는 없다mov mem, mem.

최적화를 사용하여 컴파일한 경우에는 변수가 레지스터에 배치되므로 문제가 되지 않습니다.

언급URL : https://stackoverflow.com/questions/45532808/why-does-gcc-move-variables-to-a-temporary-location-before-assigning-them

반응형