(譯)win32asm教程-8 (轉)

gugu99發表於2008-05-28
(譯)win32asm教程-8 (轉)[@more@] 

9.0更多的虛擬碼:namespace prefix = o ns = "urn:schemas--com::office" />

這兒有更多的虛擬碼

TEST

Test對兩個引數(目標,源)AND邏輯操作,並根據結果設定標誌暫存器。結果本身不會儲存。Test用來測試一個位,例如暫存器:

Test eax, 100b;b字尾意為二進位制
jnz bitset

如果eax右數第三個位被設定了,jnz將會跳轉。Test的一個非常普遍的用法是用來測試一方暫存器是否為空:

test ecx, ecx
jz somewhere

如果ecx為零,Jz跳轉

關於棧的虛擬碼

在我講棧的虛擬碼之前,我會先解釋什麼是棧。棧是的一個地方,esp為指向棧的指標。棧是用來儲存臨時數值的地方,有兩個指令來放入一個指和再把它取出來:push和pop。Push把一個指壓入棧。Pop再把它彈出來。最後一個放入的值最先出來。一個值被放入棧中,棧指標步減,當它移出來的時候,棧指標步增。看這個例子:

(1)mov ecx, 100
(2) mov eax, 200
(3) push ecx ; save ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx

解釋

1、 把100放入ecx中

2、  把200放入eax中

3、  把ecx(等於100)壓入棧中(第一個壓入)

4、  把eax(等於200)壓入棧中(最後壓入)

5、  /6/7:對ecx執行操作,使ecx的值改變

8彈出ebx:ebx成為200(最後壓入,最先彈出)
9彈出ecx:ecx又成為100(最先壓入,最後彈出)

為了說明再壓棧和彈棧時,記憶體中發生了什麼,看下圖:

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

00

00

00

00

00

00

00

00

00

 

 

 

 

 

ESP

 

 

 

 

(棧在這裡是初始化為0,但實際上並不是這樣。ESP表示ESP指向的offset)

mov ax, 4560h
push ax

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

00

00

60

45

00

00

00

00

00

 

 

 

ESP

 

 

 

 

 

 

mov cx, FFFFh
push cx

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

FF

FF

60

45

00

00

00

00

00

 

ESP

 

 

 

 

 

 

 

 

pop edx

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

FF

FF

60

45

00

00

00

00

00

 

 

 

 

 

ESP

 

 

 

 

Edx現在是 4560FFFFh 了.

CALL和RET

Call跳轉到某段程式碼而且一發現RET指令就返回。你可以把它們看成在其他語言中的或子。例如:

……程式碼……
call 0455659
……更多程式碼……

455659處的程式碼:

add eax, 500
mul eax, edx
ret

當執行這條指令時,跳到455659處的程式碼,執行指令一直到ret為止,並返回到處的下一條。Call跳轉到的程式碼被成為過程(procedure)。你可以把你反覆使用的程式碼寫進一個過程並在你每次需要它的時候呼叫。

更深入的細節:call把EIP(指向將要執行指令的指標)壓入棧,而ret指令在它返回的時候把它彈出來。你也可以給一個call指定的引數。這是由壓棧來完成的:

push something
push something2
call procedure

在一個呼叫的內部,引數從棧中讀出並使用。注意,只在過程中需要的區域性變數也儲存在棧中。我不會在此深入下去,因為它可以在masm和tasm中很輕易的完稱。只要記住你可以寫過程,而且它們可以由引數。一個重要的地方:

eax幾乎總是用來裝一個過程的返回值。

對於函式也是如此。但然,你可以在你的過程使用其他的暫存器,但這是標準。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章