作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] C語言return問題
時間Tue Jan 17 21:29:46 2017
我不確定對不對, x64 call convention 我不太熟,
你的程式碼翻成組合語言是以下那樣:
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
movl $0x5,-0x4(%rbp)
mov -0x4(%rbp),%eax
mov %eax,%edi
callq 4004e6 <sum>
mov %eax,%esi
mov $0x4005b4,%edi
mov $0x0,%eax
callq 4003e0 <printf@plt>
mov $0x0,%eax
call printf 時,
rdi 是 "%d" (mov $0x4005b4,%edi)
rsi 就是要印出的數字,
在這個組合語言上,
movl $0x5,-0x4(%rbp)
mov %eax,%edi
rsi 在這個時候得到 5,
所以 printf 才印出 5。
你可以試試把程式編成 32 bit 模式, 應該就不會是 5。
我的測試環境:
debian x64/gcc 5.4
※ 引述《pppty (無)》之銘言:
: 開發平台(Platform): (Ex: Win10, Linux, ...)
: Win10
: 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
: GCC
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: 問題(Question):
: 單純測試有設定return型態但是沒有return值的狀況
: 餵入的資料(Input):
: 無
: 預期的正確結果(Expected Output):
: compile不過
: 錯誤結果(Wrong Output):
: 印出傳入的數值
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: #include <stdio.h>
: int sum(int a){
: a+1;
: }
: int main(){
: int a = 5;
: printf("%d", sum(a));
: }
: 補充說明(Supplement):
: 以前初學C的時候因為沒測試過這種狀況
: 前兩天碰到但是不知道原理
: 原本猜測會在編譯時候出錯 但是編譯可以過 以及還能夠印出值(5)
: 代表以前學到的概念錯很大
: 想請問compiler是怎麽處理這個部分的呢?
: (以為compiler不會過但是過了,過了以為數值會是未知數卻是5這樣)
: 希望能有前輩能解惑 感謝
--
紙上得來終覺淺,絕知此事要躬行。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.204.64.97
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1484659793.A.9FA.html
※ 編輯: descent (180.204.64.97), 01/17/2017 21:31:14
1F:推 pppty: 感謝回覆 組語只碰過一點點 暫存器不熟 會找時間研究一下 01/18 23:30