(譯)win32asm教程-9 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (譯)win32asm教程-7 (轉)Win32ASM
- (譯)win32asm教程-8 (轉)Win32ASM
- (譯)win32asm教程-10 (轉)Win32ASM
- (譯)win32asm教程-11 (轉)Win32ASM
- (譯)win32asm教程-5 (轉)Win32ASM
- (譯)win32asm教程-6 (轉)Win32ASM
- (譯)win32asm教程-12-完結 (轉)Win32ASM
- (譯)win32asm例項-1 (轉)Win32ASM
- (譯)win32asm例項-3 (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (四) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (三) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (七) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (六) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (八) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (一) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (五) (轉)Win32ASM
- win32asm原理 (轉)Win32ASM
- Win32Asm 教程,來自易語言俱樂部論壇,譯者taowen。 (5千字)Win32ASM
- Win32ASM經驗點滴 (轉)Win32ASM
- Java Servlet和JSP教程(9)(轉)JavaServletJS
- Direct3D9初級教程 (轉)3D
- NeHe的opengl教程delphi版(9)----星星 (轉)
- [譯] [1] + [2] - [3] === 9!? 型別轉換深入研究型別
- Eigen教程(9)
- XML簡明教程(9)什麼是C++ XML DSO(轉)XMLC++
- 遊戲製作相關---HAM教程翻譯本(五)(轉)遊戲
- 遊戲製作相關---HAM教程翻譯本(四)(轉)遊戲
- 【譯】UIVisualEffectView教程UIView
- Openwrt編譯教程編譯
- VB.Net中文教程(9) 重新定義(Overriding)程式 (轉)
- klayge 4.2.0 編譯vc9編譯
- 【譯】9. Java反射——泛型Java反射泛型
- ZooKeeper 官方教程[翻譯]
- [翻譯]CMAKE官方教程
- Git 系列教程(9)- 打標籤Git
- Tensorflow快餐教程(9)-卷積卷積
- [譯] part 9: golang 迴圈語句Golang