看板 C_and_CPP 關於我們 聯絡資訊
我不確定對不對, 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://www.ptt.cc/bbs/C_and_CPP/M.1484659793.A.9FA.html ※ 編輯: descent (180.204.64.97), 01/17/2017 21:31:14
pppty: 感謝回覆 組語只碰過一點點 暫存器不熟 會找時間研究一下 01/18 23:30