C 호출 규칙에 대해 배우고 싶습니다. C 디스 어셈블 된 호출 이해
#include <stdio.h>
#include <stdlib.h>
struct tstStruct
{
void *sp;
int k;
};
void my_func(struct tstStruct*);
typedef struct tstStruct strc;
int main()
{
char a;
a = 'b';
strc* t1 = (strc*) malloc(sizeof(strc));
t1 -> sp = &a;
t1 -> k = 40;
my_func(t1);
return 0;
}
void my_func(strc* s1)
{
void* n = s1 -> sp + 121;
int d = s1 -> k + 323;
}
가 그럼 난 다음 명령을 사용하여 GCC를 사용 : 이렇게하려면 다음 코드 작성
gcc -S test3.c
을하고 어셈블리를 함께했다. 내가 가진 전체 코드를 표시하지는 않지만 함수 my_func에 대한 코드를 붙여 넣습니다. 그것은 이것이다 :
my_func:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -24(%rbp)
movq -24(%rbp), %rax
movq (%rax), %rax
addq $121, %rax
movq %rax, -16(%rbp)
movq -24(%rbp), %rax
movl 8(%rax), %eax
addl $323, %eax
movl %eax, -4(%rbp)
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
지금까지 내가 이해로 절차가 진행됩니다 먼저 발신자의 기본 포인터가 스택에 푸시하고 스택 포인터가 새의 스택을 설정하는 새 기본 포인터를 만들어 기능. 하지만 나머지는 이해가 안됩니다. 내가 아는 한, 인수 (또는 인수에 대한 포인터)는 스택에 저장됩니다. 그래서 제 2 명령의 목적, 여기
movq -24(%rbp), %rax
무엇이면 %의 RAX 레지스터의 내용이 24 바이트 떨어져 레지스터 %의 RBP의 어드레스로부터의 어드레스로 이동된다. 하지만 % rax에는 무엇이 있습니까 ???? ???? 아무것도 처음에 거기에 저장되지 ??? 나는 혼란 스럽다고 생각합니다. 이 기능의 작동 방식을 이해하는 데 도움을주십시오. 미리 감사드립니다.
컴파일 심지어'GCC -fverbose-ASM -O -S'; 참고 문헌 [* lot *]을주는 [이 답장] (http://stackoverflow.com/a/16088155/841108)도 참조하십시오. –
모든 참고 자료와 편집 팁을 보내 주셔서 감사합니다. – user2290802