以下代碼的含義是什麼?彙編x86測試si
mov si, [L10003248]
test si, si
jnz L10004356
我認爲,這意味着跳轉到L10004356
如果L10003248
地址不爲空。我認爲這與存儲在L10003248
中的值無關,否則它使用word ptr
。
我的假設是否正確?
它聽起來不合邏輯。由於這個跳躍看起來微不足道。
我沒有關於編譯器的信息。
以下代碼的含義是什麼?彙編x86測試si
mov si, [L10003248]
test si, si
jnz L10004356
我認爲,這意味着跳轉到L10004356
如果L10003248
地址不爲空。我認爲這與存儲在L10003248
中的值無關,否則它使用word ptr
。
我的假設是否正確?
它聽起來不合邏輯。由於這個跳躍看起來微不足道。
我沒有關於編譯器的信息。
mov si, [L10003248]
確實涉及到的內存位置在L10003248
,而不僅僅是地址。這是由方括號唯一表示的。
[...]否則就用了這個詞的ptr [...]
不,word ptr
並不表示一個內存位置,但是存儲位置的大小。
取指令
mov [eax], 12h
現在,彙編器可以猜測的12h
大小是什麼。它是16位(0012h
)?或8位(12h
)?這需要作爲信息傳遞給彙編程序。在這裏,ptr
指令發揮作用:
mov word ptr [eax], 12h
現在,彙編unambigously知道數據的16位有複製。同樣,byte ptr
和dword 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語法相反)。在這裏,你後綴(b
爲byte
,w
,爲word
,l
爲long
,並q
爲quadword
)追加到記憶,而不是ptr
指令:
movw 0x12, (16_bit_mem)
這是在& T語法,當然(源操作數和目標操作數,交換,0x
而不是h
等)。
[L10003248]表示* L10003248,它是存儲在地址L10003248中的值。
所以,你的代碼實際上意味着:
si = *L10003248;
if (si != 0)
jmp L10004356
它** **不涉及到儲存在'L10003248'值。您似乎誤解了'ptr':http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm – Downvoter
@cad請將其作爲答案。 –