学 Win32 汇编[30] - 条件及循环伪指令: .IF、.WHILE、.REPEAT 等

学 Win32 汇编[30] - 条件及循环伪指令: .IF、.WHILE、.REPEAT 等


.IF、.ELSEIF、.ELSE、.ENDIF: 条件伪指令

;可以使用和 C 语言类似的条判断:
a == b
a != b
a >  b
a >= b
a <  b
a <= b
a && b
a &  b
a || b
!a

;还可以直接判断几个常用的标志位:
CARRY?    ;进位标志
OVERFLOW? ;溢出标志
PARITY?   ;奇偶标志
SIGN?     ;符号标志
ZERO?     ;零标志

; Test30_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    xor eax, eax
    .if !eax
        PrintText 'EAX = 0'
    .endif
    ;
    mov eax, 3
    .if eax == 3
        PrintText 'EAX = 3'
    .else
        PrintText 'EAX != 3'
    .endif
    ;
    mov eax, 4
    .if eax == 3
        PrintText 'EAX = 3'
    .elseif eax > 3
        PrintText 'EAX > 3'
    .else
        PrintText 'EAX < 3'
    .endif
    ret
main endp
end main


; Test30_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 1
    mov edx, 0
    .if eax && edx
        PrintText '&&'
    .endif
    
    .if eax || edx
        PrintText '||' ;
    .endif
    
    .if eax & edx
        PrintText '&'
    .endif
    ret
main endp
end main

.WHILE、.ENDW: While 循环伪指令:

; Test30_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 9
    .while eax > 0 
        PrintDec eax
        dec eax
    .endw    
    ret
main endp
end main

.REPEAT、.UNTIL: Repeat 循环伪指令:

; Test30_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 9
    .repeat
        PrintDec eax
        dec eax
    .until eax == 0  
    ret
main endp
end main

.While 与 .Repeat 都支持 .Break 和 .Continue

.WHILE 与 .BREAK:

; Test30_6.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 9
    .while TRUE
        PrintDec eax
        dec eax
    .break .if eax == 5
    .endw    
    ret
main endp
end main

.REPEAT 与 .CONTINUE:

; Test30_7.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 0
    .repeat
        inc eax
    .continue .if eax == 2
        PrintDec eax
    .until eax > 3
    ret
main endp
end main

posted on 2010-04-21 17:26  万一  阅读(6424)  评论(0)  编辑  收藏
上一篇:循环流程


下一篇:排队叫号系统