(譯)win32asm教程-9 (轉)

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

10.0 masm的優點:namespace prefix = o ns = "urn:schemas--com::office" />

如果你不在使用masm,你可以跳過這章並嘗試著轉換所有的例子,或不論如何地讀一下,並試著說服自己使用masm。當然,這是你的選擇。但masm真的使語言更容易了。

10.1 條件和迴圈結構

Masm有一些偽高階的語法來簡便地建立條件和迴圈結構:

.IF, .ELSE, .ELSEIF, .ENDIF
.REPEAT, .UNTIL
.WHILE, .ENDW, .BREAK
.CONTINUE

If

如果你有使用語言的(你應該有),你可能已經看到了一些像if/else的結構:

.IF eax==1
;eax
等於1
.ELSEIF eax=3
; eax
等於3
.ELSE
; eax
既不是1也不是3
.ENDIF

這種結構非常有用。你不需要和一對跳轉攪在一起了,只要一個.IF語句(也不要忘記.IF和.ELSE之前的時期)。巢狀的if是允許的:

.IF eax==1
.IF ecx!=2
; eax= 1
而且 ecx 不是 2
.ENDIF
.ENDIF

但可以更簡潔些:

.IF (eax==1 && ecx!=2)
; eax = 1
而且 ecx 不是 2
.ENDIF

這些是你可以使用的運算子:

==

等於

!=

不等於

>

大於

<

小於

>=

大於等於

<=

小於等於

&

位測試

!

邏輯非

&&

邏輯與

||

邏輯或

CARRY?

carry bit set

OVERFLOW?

overflow bit set

PARITY?

parity bit set

SIGN?

sign bit set

ZERO?

zero bit set

Repeat

這個語句一塊指令知道條件為真為止:

.REPEAT
;程式碼在此
.UNTIL eax==1

這塊程式碼反覆執行repeat和until之間的程式碼,知道eax=1。

While

While是repeat語句的反轉。它在條件為真時執行程式碼塊:

.WHILE eax==1
;程式碼在此
.ENDW

你可以使用.BREAK語句來跳出迴圈

.WHILE edx==1
inc eax
.IF eax==7
.BREAK
.ENDIF
.ENDW

如果Eax==7,while迴圈將停止

continue指令使repeat或While跳過下面的程式碼塊,重新執行迴圈。

10.2 invoke

這是勝過tasm和nasm最大的優點。Invoke簡化了過程和call的使用。

一般的格式:

push parameter3
push parameter2
push parameter1
call procedure

Invoke 格式:

invoke procedure, parameter1, parameter2, parameter3

彙編後的程式碼是一摸一樣的,但invoke格式更簡單而且更可靠。對一個過程使用invoke,你要這樣定義:

PROTO STDCALL testproc:D, :DWORD, :DWORD

宣告瞭名為testproc,需三個DWORD大小的引數的過程。現在,如果你這麼做……

invoke testproc, 1, 2, 3, 4

……masm會給你一個testproc過程需要三個引數而不是四個的錯誤。Masm還會做型別檢查。它檢查引數是否為正確的型別(即大小)

在一個invoke語句中,你可以用ADDR代替offset。這會使地址在彙編時是正確的。

過程這樣定義:

testproc PROTO STDCALL :DWORD, :DWORD, :DWORD

.code

testproc proc param1:DWORD, param2:DWORD, param3:DWORD

ret
testproc endp

這會建立一個名為testproc,帶三個引數的過程。Prototype是用來過程的。

testproc PROTO STDCALL :DWORD, :DWORD, :DWORD

.code

testproc proc param1:DWORD, param2:DWORD, param3:DWORD

mov ecx, param1
mov edx, param2
mov eax, param3
add edx, eax
mul eax, ecx

ret
testproc endp

現在,過程做了一下計算,(param1, param2, param3) = param1 * (param2 + param3).結果(返回值)存放在eax中,區域性變數這樣定義:

testproc proc param1:DWORD, param2:DWORD, param3:DWORD
LOCAL var1:DWORD
LOCAL var2:BYTE

mov ecx, param1
mov var2, cl
mov edx, param2
mov eax, param3
mov var1, eax
add edx, eax
mul eax, ecx
mov ebx, var1
.IF bl==var2
xor eax, eax
.ENDIF

ret
testproc endp

你不可以在過程外使用這些變數。它們儲存在棧中而且當過程返回時移出。

10.3宏

現在不解釋宏。可能在以後的教程中,但現在它們對我們不重要。


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

相關文章