2012-04-07 272 views
2

我在業餘時間學習彙編語言,成爲一名更好的開發人員。我已經從亞馬遜購買了一本書,很快就會發布,並且我正在嘗試在深入研究之前熟悉基本概念。彙編和寄存器

我對用於通用任務的通用寄存器感到困惑。我知道C編程語言,並且已經閱讀了關於調用約定的彙編和Windows API。

但是,如果您有一個非常簡單的任務,例如將兩個數字加在一起,並且沒有引用C等,那麼你會使用哪個寄存器?

我意識到這是一個基本問題。

+1

爲什麼不寫一個簡單的程序,並看看反彙編代碼開始? – Michael 2012-04-07 15:59:48

+0

@Michael,查看C編譯代碼的最佳方法是什麼?我知道在.NET中你可以使用ILASM/ILDASM,而且我知道如何在Java中完成它。我不知道如何在C. – w0051977 2012-04-07 17:07:52

+0

@ w0051977中做到這一點,許多C編譯器都可以選擇輸出彙編源代碼而不是二進制庫或可執行文件。檢查你的編譯器的文檔。 – 2012-04-07 18:38:46

回答

3

無論你想要什麼,真的。

在第一代8086處理器中,一些通用寄存器(AX,BX,CX,DX)也具有半特殊用途。例如,LOOP操作碼假定你的循環計數器在CX中; DIV操作碼將結果存儲在AX和DX中。一些尋址模式可以使用BX或SI或DI作爲偏移量,但不能將其他通用寄存器用作偏移量。

在成功的處理器世代中,其中一些特殊用途已經淡化 - 例如,我認爲現在大多數操作碼可以使用任何寄存器作爲偏移量,而不僅僅是BX。所以大多數情況下,通用寄存器是可以互換的。

如果你想遵循歷史先例,(E)AX是「累加器」,所以它將是傳統的地方,例如,正在對一系列數字進行求和時的運行總數。因此,如果您正在進行添加,並且您不確定將結果放入哪個註冊表中,(E)AX將是一個很好的默認選擇。