2010-05-15 157 views
3

我有2個簡單的,但也許棘手的問題。假設我有彙編語言指令: MOV EAX,[ebx + 6 * 7] - 我很好奇的是,這個指令是否真的轉化爲操作碼,因此括號中的代碼計算被編碼成操作碼,或者這只是編譯器的僞指令,而不是CPU,因此編譯器在使用add mul計算括號內的值之前,將結果存儲在某個reg中,並使用MOV EAX,reg與計算值?只是要清楚,我知道輸出將是相同的。我對執行感興趣。x86彙編程序問題

其次是關於LEA指令。我知道它的作用,但我更感興趣的是它的真實指令,所以編譯不會進一步改變它,只是將它編譯爲操作碼,或者只是編譯器的僞代碼,再次,首先計算地址並將其存儲。

回答

5

彙編(不是編譯器,雖然它是非常相似)將制定出6*7位爲42,然後指令是:

MOV EAX,[ebx+42] 

這是什麼處理器可以通過添加的內容執行, ebx寄存器和常數42,然後使用該地址加載起來eax。沒有指令將6和7編碼爲不同的實體,稍後將相乘。

LEA與其他任何指令一樣真實。同樣,彙編器可以處理常量摺疊(計算出固定值),以使彙編語句成爲處理器可用的形式。

你只需要想想指令:

mov ax,1+1+1+1+1+1+1 

這不會被編碼爲字節eb 01 01 01 01 01 01 01的一些(神奇)序列,它會被精確編碼與任何如下:

mov ax,7 
mov ax,49-42 
mov ax,42/6 
+0

49-2 = 47在我的書中 – 2010-05-16 12:48:35

3

1)是
2)是

即它們都完全轉換爲操作碼編碼。但是請記住,現代X86 CPU的底層架構與彙編器引導您期望的非常不同。所以僅僅因爲它變成了單個指令並不意味着它將作爲處理器上的單個指令被處理。