回覆列表
-
1 # tolhh2150
-
2 # 使用者7561284500298
不用多想,看看下面這個c函式編譯出來的彙編檔案是怎麼樣就可以了:
編譯:
生成的彙編檔案如下:
riscv32體系結構呼叫協定中,用暫存器a0至a7傳遞引數,用暫存器a0或{a1, a0}傳遞返回值。
f中的兩條sw指令將a0和a1存入堆疊,也就是區域性變數a和b;
然後先取區域性變數a的值存入暫存器a5,並判斷a5是否為假,如果為假就跳轉到.L2(不再判斷區域性變數b)。否則,繼續取區域性變數b的值存入暫存器a5,再判斷是否為假,如果為假仍然跳轉到.L2。否則,利用a5暫存返回值1,並跳轉到.L3;
.L2利用a5暫存返回值0,並執行.L3;
.L3將暫存返回值暫存器a5的值存入返回值暫存器a0,釋放當前棧幀並返回。
c語言的種種規則只是一份標準檔案,背誦標準檔案不如看看被固化為程式的標準檔案(編譯器)對輸入的行為。
根據引數型別以及函式實現的功能綜合判斷。注意不能單單看是否為指標。 要傳遞型別為A的值,如果引數型別是A*,那麼為傳地址,反之,如果引數型別是A,那麼是傳值。比如,要傳遞int型引數:
1 傳值:void func(int a);
2 傳地址:void func(int *a);而傳遞char *型引數。1 傳值:void func(char *a);2 傳地址:void func(char **a);同樣是char *型別的引數,有可能是傳值,也有可能是傳地址。具體取決於函式實現功能。