c語言的引數傳遞和返回值,如何從彙編角度來理解他們的不同之處?

時間 2021-06-03 00:44:23

1樓:

僅從彙編角度來說,沒有區別,甚至沒有傳參和返回值這個概念。你可以自行決定使用堆疊或暫存器來傳遞,簡單點講,往暫存器裡丟個東西,只要不清零或重寫,任何時候你都可以使用它。所謂的返回值也可以不止乙個,想返回什麼就把什麼丟到任何乙個或多個暫存器裡,乙個暫存器存不下可以用多個。

所謂返回只是操作一下ip,有沒有值以及怎麼用值是接下來自己要處理的事情,要用就去暫存器讀取。

從c的角度,是否使用堆疊或暫存器來傳參或返回取決於編譯器實現。對32位gcc而言,傳參使用堆疊,返回值存到暫存器eax,存不下分到其他暫存器。64位的gcc約定,傳參優先使用暫存器,一是因為暫存器數量多到足夠用,二是因為使用暫存器比使用棧快。

當然,這只是gcc的實現,非要寫個64位c編譯器用堆疊傳參也可以。

windows不了解,大概也是類似的吧。

2樓:

彙編上沒有太大區別,

返回值:return返回後其實函式呼叫就結束了,計算機約定會將函式內的結果放入預設的暫存器,例如eax,return以後賦值給另乙個變數的話,編譯後彙編層面就是給你添一筆,把暫存器的結果mov給你這個變數位址。

乙個是在函式內拿到結果,乙個是在外自己去指定位置拿,傳引用比返回值少了一次搬運。

3樓:d41d8c

不要這麼理解。C語言是體系結構無關的(不管是哪個體系結構,編譯出來的程式都有一致的行為),而不同體系結構有不同的彙編。所以不要用彙編去套C語言

請問c語言中的 的返回值是什麼?

暮無井見鈴 一段時間內 都是。至少在 C99 C17 中,true 就是 int 型別的 1 不過在 C23 1 中改掉了。true 變成了 Bool 1u 型別變成了 Bool 而在預處理環境中表現為無符號整數。 邱昊宇 是 int 型的 0 或者 1 The equal to and not e...

怎樣生動的理解C語言中的返回值return?

醉臥沙場 知道C語言的返回值是什麼並不難,它一般只是乙個儲存在約定暫存器 比如eax 中返回給呼叫函式讀取的數值而已。但是如果你需要了解整個函式呼叫以及返回的過程,才能對其有更全面的理解。我給很多人解釋過函式呼叫和返回的事情了,所以這裡不再過多贅述細節。有興趣的話可以看我為此寫的系列文章 醉臥沙場 ...

c語言中的RETURN()返回值是什麼意思?

大多數函式在執行完畢後,需要向呼叫者報告函式的執行結果,就像大多數leader都會要求 及時回話 一樣。函式的執行結果可以是數學計算的值,也可以是用以表示操作執行狀態的其他值 例如寫磁碟檔案是否成功,成功則搞0,不成功則報告其他值 一般而言,向呼叫者報告執行結果是通過函式的返回值來實現的,也就是通過...