2016-07-09 43 views
3

我正在寫一個裝配的小機器代碼生成器。我有一個關於立即對內存的說明了一個問題:大會字/字節/字的正確使用PTR

讓我們這3種方案:

add [ebx+04], 0x1 
add [ebx+04], 0x4040 
add [ebx+04], 0x401000 

我做的是被眼前的不斷持續,我檢查什麼是它可以容納最小字節數那麼我想無論是其字節的PTR,PTR字,DWORD PTR

首先一個可以容納1個字節,所以我認爲它是:

add byte ptr [ebx+04], 0x1 

其次可以容納2字節,因此我認爲它是:在4個字節

add word ptr [ebx+04], 0x4040 

第三千篇一律,所以我認爲它是:

add dword ptr [ebx+04], 0x401000 

這是正確的嗎?

+8

號你怎麼能指望產生的1 32位補充的嗎? PTR註釋是有原因的。 –

+2

有字節ptr,字ptr等命名的原因。因爲用戶需要能夠選擇哪個指令/操作數。如果你是自己製作的,你可以使用addb,addw,addd而不是x ptr。 –

+1

if add [ebx + 04],0x00000001產生一個dword ptr,如果用戶理解了彙編語言的規則,那麼也許你可以逃避它。 –

回答

5

你最肯定需要接受這些類型的指令大小的標籤。

但我wouln't解僱的代碼,看看有什麼合適的數字,因爲你需要一種方法來在possibiliy決定使用基於延伸的字節標誌較小編碼:

add dword ptr [ebx+4], 1 

這可以用4個字節立即編碼,但更有趣的是用1個字節立即編碼。

+0

我有另一個問題,我知道你可以使用這個位來標記8位的值擴展到32位。它也適用於16bit到32bit嗎? – Budskii

+1

x86體系結構定義,當操作數大小爲16位時,此_s-bit_符號將一個字節擴展爲一個字,並且當操作數大小爲32位時,它將一個字節擴展爲一個雙字。這明顯排除了從16位擴展到32位的符號。 – Fifoernik

3

如果您還實現了一種明確指定操作數大小,因爲它是你的彙編,這是最終你的電話,以允許或沒有這樣的「智能」演繹。

我反對它強烈建議,程序員不選擇基於即刻值數大小,而是選擇基於操作數大小的立即數。
簡而言之,我們認爲add DWORD [ebx+04h], 1add WORD [ebx+04h], 1兩個完全獨立的指令。

相關問題