반응형
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
반응형
'programing' 카테고리의 다른 글
HTML/CSS를 사용하여 텍스트에 공백/탭을 삽입하는 방법 (0) | 2023.08.16 |
---|---|
Python 스크립트에서 PowerShell 함수 실행 (0) | 2023.08.16 |
Get-WMIObject \Get-Cim 인스턴스는 실제로 무엇을 합니까? (0) | 2023.08.11 |
Fill remaining vertical space with CSS using display:flex (0) | 2023.08.11 |
스위프트를 사용하여 iOS에서 Numpad에 "완료" 버튼을 추가하는 방법은 무엇입니까? (0) | 2023.08.11 |