求解答《深入理解計算機系統》和袁春風的《計算機系統基礎》一書中過程呼叫的細節為何有所區別

時間 2021-06-05 20:28:29

1樓:

這個是程式設計裡面的三種強度不同的約束。

第一種是規定,intel 的硬體手冊裡面寫,你寫 call Q,那麼 eip 就會跳到 Q 所在的那個位址。如果實現函式,你必須自己準備好引數和返回值。

那不準備好引數和返回值可以使用 call Q嗎,當然也可以,但是會出錯。

這就是規定的含義:無論你有沒有準備好,他只按他的來。寫軟體的人除了遵守別無選擇。

第二種是約定。約定是兩個寫軟體的人的相互規定,比如誰來儲存 ebp,按道理講呼叫者和被呼叫者只要乙個人儲存就可以,當然兩者都儲存也可以。但是兩者都不儲存肯定是不可以的。

那我發明乙個語言,對外函式我就不儲存。我只和儲存 ebp 的那些語言玩,萬一遇到乙個一樣不想儲存 ebp 的語言,那就別玩了。

約定的影響是,不遵守雖然不方便,但是你要堅持只要有人配合也不是不可以。而硬體不會或者不能配合你。

第三種是慣例。比如 for 迴圈大家都寫 for (i=0)這樣,你說我就喜歡用 x ,堅決不用字母 i。這當然沒問題,而且影響其實也不大。從程式角度你影響不了別人。

這麼看題目就很簡單,首先他不是規定,其次單個程式不涉及合作,那也不是約定。

那就只能是慣例了。那這個慣例是為啥來的?

我給你乙個完整且詳細的思路。

這個問題你這麼分析,兩者的區別是有沒有在最開始把 esp 賦值給 ebp。賦值以後,兩者乙個指向棧底不動,乙個指向棧頂按需進退。

賦值將會讓你擁有同時操作棧兩端資料的能力,如果不賦值,那你可以很方便操作棧頂,棧底資料在什麼位置沒儲存就不方便使用了。

那既然同時操作棧兩端這麼好,為什麼還有人不用呢。首先我們明確,他肯定是可以用的,但是選擇不用。肯定是因為不用有不用的好處。

那不用他用啥呢,當然用其他暫存器了。暫存器比棧好,因為快嘛。棧是記憶體,比暫存器就慢一些。

那反過來,既然暫存器這麼好,那為什麼那個人不用呢?肯定有他不用的理由,最可能的,他就沒有那麼多暫存器可以用。

從這個現象我們可以得出兩個想法。

第一,在學彙編的時候,CPU 有多少個暫存器,以及他們可以怎麼被使用非常重要。

有10個你只用了5個,別的用了記憶體,這是浪費。有5個你以為可以用10個,白瞎,根本沒有那麼些給你用。

第二,同樣的任務,不同硬體的時候,演算法就不一樣,而且兩者都是最好的解法。

那我們舉一反三推而廣之,理論上來說,對同乙個大型任務,每一套不同配置的機器,都應該有他專屬的最優演算法。小的任務比如1+1等於幾當然無所謂啦。

而且冥冥之中你可能也有點感覺,這個所謂的最優,數學上好像也可以證明,因為他必然存在,並且唯一或者等效。

題主別擔心,以上的內容後續都會學到。什麼計算機網路啦,演算法優化啦,組成原理體系結構啦。數學分析概率論啦。正經大學全部都教。

如何閱讀《深入理解計算機系統》

Code Diy 這是乙份地圖,而不是乙個世界。這是乙份地圖,而不是乙個世界。這是乙份地圖,而不是乙個世界。先整體看下目錄 第一章計算機系統的漫遊 第一部分程式結構和執行 第二部分在系統上執行程式 第三部分程式間的互動和通訊 顯而易見主要分為四部分 第一章猶如乙個老練的導遊,以乙個簡單的例子為起點,...

如何閱讀《深入理解計算機系統》這本書?

msowb 這本書感覺已經夠淺顯易懂了,個人認為只要學了C語言基礎就可以讀了。讀不下去只能說你不適合幹這行了。讀得慢不是問題,讀懂了,讀一遍基本就可以了。本身講的也都是一些基礎知識。不必強求用不用得上,跟著做做lab就好了。 臥樓聽松 別的我不說,我只是建議,看題目這本書之前先看這本 計算機系統 系...

跨考408有必要先看完深入理解計算機系統嗎 或者其他必要性書籍推薦

貪狼天尊 現在你要學的必要性書籍主要是408的那幾門,資料結構,計算機組成原理,計算機作業系統和計算機網路。你需要先把初試給過了,這四門還是要參考輔導書一起複習的,必要時候網課也可以看。資料結構跨考放棄嚴奶奶版,如果你之前學過演算法也也可以繼續學這版,如果沒有選擇其他版本,是正規教材的都行。計算機組...