2.4 OpenEuler中C語言中的函式呼叫測試(選做)
阿新 • • 發佈:2021-12-05
任務詳情
- 在X86_64架構下實踐2.4中的內容
- 通過GDB檢視暫存器的內容,把教材中的圖填入具體的值
- 把2.4的C程式碼在OpenEuler中重新實踐一遍,繪製出ARM64的邏輯框圖
- 實驗內容要經過答辯才能得到相應分數
一、32位gcc中的執行時堆疊使用情況
main.c程式碼:
main(){
int a,b,c;
a=1;b=2;c=3;
c=sub(a,b);
printf("c=%d\n",c);
}
sub.c程式碼
int sub(int x,int y){ int u,v; u=4;v=5; return x+y+u+v; }
使用指令gcc -g main.c sub.c -o main -m32
進入gdb除錯
在main處設定斷點
disas:檢視彙編程式碼
i(info) r(registers):檢視暫存器的值
可以看到U和v入棧(int的位元組為4)
以及他們存放的地址
傳遞引數:此時pc指向的是sub()的入口地址
進入sub後的堆疊內容:現在我們已經知道u、v的內容以及實體地址
我們可以由此寫出函式的呼叫序列。
long jump
程式碼:
include<stdio.h> #include<setjmp.h> jmp_buf env; int main() { int r,a=100; printf("call setjmp to save environmen\n"); if((r=setjmp(env))==0){ A(); printf("normal return\n"); } else printf("back to main() via long jump,r=%d,a=%d",r,a); } int A() { printf("enter A()\n"); B(); printf("exit A()\n"); } int B() { printf("enter B()\n"); printf("long jump?(y|n) "); if(getchar()=='y') longjmp(env,1234); printf("exit B()\n"); }
編譯指令:gcc jump.c -o jump -m32
執行結果:
在main處設定斷點,檢視彙編程式碼:
二、64位gcc中的執行時堆疊使用情況
程式碼:
#include <stdio.h> int sub(int a, int b, int c, int d, int e, int f, int g, int h) { int u, v, w; u = 9; v = 10; w= 11; return a+g+u+v; } int main() { int a, b, c, d, e,f, g, h,i; a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = sub(a,b,c,d,e,f,g,h); }
執行結果:
不會產生結果。
生成.s檔案,檢視彙編程式碼: