2015-10-19 96 views
1

以下代碼的含義是什麼?彙編x86測試si

mov si, [L10003248] 
test si, si 
jnz L10004356 

我認爲,這意味着跳轉到L10004356如果L10003248地址不爲空。我認爲這與存儲在L10003248中的值無關,否則它使用word ptr

我的假設是否正確?

它聽起來不合邏輯。由於這個跳躍看起來微不足道。

我沒有關於編譯器的信息。

+3

它** **不涉及到儲存在'L10003248'值。您似乎誤解了'ptr':http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm – Downvoter

+0

@cad請將其作爲答案。 –

回答

2
mov si, [L10003248] 

確實涉及到的內存位置L10003248,而不僅僅是地址。這是由方括號唯一表示的。

[...]否則就用了這個詞的ptr [...]

不,word ptr並不表示一個內存位置,但是存儲位置的大小

取指令

mov [eax], 12h 

現在,彙編器可以猜測的12h大小是什麼。它是16位(0012h)?或8位(12h)?這需要作爲信息傳遞給彙編程序。在這裏,ptr指令發揮作用:

mov word ptr [eax], 12h 

現在,彙編unambigously知道數據的16位有複製。同樣,byte ptrdword ptr可能已被添加。有關ptr指令的更多信息,請閱讀this


另一種情況可以是

mov [16_bit_mem], 12h 

一些裝配(如MASM)記憶變量的大小,所以該指令編譯罰款。 OTOH,有些(如NASM和GNU)沒有。在NASM中,您需要編寫

mov word ptr [16_bit_mem], 12h 

向彙編器提供數據的大小。 GNU as默認使用AT & T語法(與MASM和NASM使用的Intel語法相反)。在這裏,你後綴(bbytew,爲wordllong,並qquadword)追加到記憶,而不是ptr指令:

movw 0x12, (16_bit_mem) 

這是在& T語法,當然(源操作數和目標操作數,交換,0x而不是h等)。

2

[L10003248]表示* L10003248,它是存儲在地址L10003248中的值。

所以,你的代碼實際上意味着:

si = *L10003248; 
if (si != 0) 
    jmp L10004356