汇编-.repeat循环语句

 

.repeat/.UNTIL

语法结构

  

.repeat/.until循环首先执行一遍循环体内的指令, 然后再判断条件测试表达式, 如果结果为“真”的话, 就退出循环, 如果为“假”, 则返回.repeat处继续循环, 可以看出, .repeat/.until 不管表达式的值如何,至少会执行一遍循环体内的指令。

复制代码
 
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov eax,0h
    .repeat
    
    add eax,1
        
    .until eax==100000h   ;如果为“假”, 则返回.repeat处继续循环

    ;EAX = 00100000h
 
    INVOKE ExitProcess,0  
main ENDP   
END main  
复制代码

 

.break强制退出循环

复制代码
 
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov eax,0h
    .repeat
    
    add eax,1

    .break   ;强制退出循环
        
    .until eax==100000h   

    ;EAX = 00000001h
 
    INVOKE ExitProcess,0  
main ENDP   
END main  
复制代码

 

如果.break伪指令后面跟一个.if测试伪指令的话, 那么当退出条件为“真”时才执行.break伪指令

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov eax,0h
    .repeat
    
    add eax,1

    .break  .if eax==1000h       ;eax==1000h时推出循环
        
    .until eax==100000h   

    ;EAX = 00001000h
 
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

.continue本次循环时忽略后面的代码

在循环体中也可以用.continue伪指令忽略以后的指令, 遇到.continue伪指令时, 不管下面还有没有其他循环体中的指令,都会直接回到循环头部开始执行。

【不执行.continue后面的指令】

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov eax,0h
    mov ebx,5h
    .repeat
    
    add eax,1

    .continue
    add ebx,2
        
    .until eax==100000h   

    ;EAX = 00100000h
    ;EBX = 00000005h  说明add ebx,2指令没有被执行
 
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

.repeat/.untilcxz

1.如果.UNTILCXZ后面没有写逻辑表达式,那么,由.REPEAT-.UNTILCXZ所构成的循环与用LOOP指令所过程的循环是一致的,它们都是以“CX=0”为循环终止条件

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov ecx,9h
    mov eax,0h
    .repeat
    
    add eax,2
        
    .UNTILCXZ  ;ecx作为循环次数,ecx=ecx-1=0就退出循环
    ;EAX = 00000012h=18      ECX = 00000000
    
 
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

2..REPEAT 伪指令执行循环体,.untilcxz [条件表达式]重复执行cx减1,直到cx=0或条件表达式为真 

条件表达式的形式只能是:“EXP1==EXP2”或“EXP1!=EXP2” 

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov ecx,9h
    mov eax,0h
    .repeat
    
    add eax,2
        
    .UNTILCXZ eax==4  ;ecx=ecx-1=或eax==4时就退出循环
    ;EAX = 00000004h      ECX = 00000007h
    
 
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

  

 

posted @   天子骄龙  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-12-04 MFC--窗口样式
2021-12-04 qt5-摄像头
2021-12-04 克拉默法则
2020-12-04 photoshop--移动变形工具
2019-12-04 PyHook3----键盘鼠标操作
点击右上角即可分享
微信分享提示

目录导航