• 汇编-loop循环指令


    LOOP指令是根据ECX计数器循环,将语句块重复执行特定次数。

    ECX自动作为计数器, 每重复循环一次就递减1。

    语法如下所示:

    循环目的地址必须在距离当前位置计数器的-128到+127字节范围内

    LOOP指令的执行有两个步骤:

    第一步, 将ECX减1;

    第二步, 将ECX与0比较。如果ECX不等于0, 则跳转到标号destination。如果ECX等于0, 则不发生跳转, 控制将被传递到循环后面的指令

    1. .386
    2. .model flat,stdcall
    3. .stack 4096
    4. ExitProcess PROTO,dwExitCode:DWORD
    5. .data
    6. .code
    7. main PROC
    8. mov eax,0
    9. mov ecx, 5
    10. L1:
    11. inc eax
    12. loop L1
    13. INVOKE ExitProcess,0
    14. main ENDP
    15. END main

    在上面的例子中,每次循环都将EAX加1。当循环结束时, EAX=5, ECX= 0

    一个常见的编程错误是, 在循环开始之前, 无意中将ECX初始化为0。如果发生了这种情况, LOOP指令将ECX减1后, 其值就变为FFFF FFFFh,循环次数就变成了4294967296

    嵌套循环

    嵌套循环当在一个循环中再创建一个循环时,就必须特别考虑外层的循环计数器ECX, 可以将它保存在一个变量中:
     

    1. .386
    2. .model flat,stdcall
    3. .stack 4096
    4. ExitProcess PROTO,dwExitCode:DWORD
    5. .data
    6. count DWORD ?
    7. .code
    8. main PROC
    9. mov eax,0
    10. mov ecx, 100 ;设置外层循环计数值
    11. L1:
    12. mov count, ecx ;保存外层循环计数值
    13. mov ecx, 20 ;设置内层循环计数值
    14. L2:
    15. inc eax
    16. loop L2
    17. mov ecx, count ;恢复外层循环计数值
    18. loop L1
    19. ;EAX = 000007D0h=2000
    20. INVOKE ExitProcess,0
    21. main ENDP
    22. END main

    实例一:整数数组求和

    1. .386
    2. .model flat,stdcall
    3. .stack 4096
    4. ExitProcess PROTO,dwExitCode:DWORD
    5. .data
    6. intarray DWORD 10000h, 20000h, 30000h, 40000h
    7. .code
    8. main PROC
    9. mov edi, OFFSET intarray ;EDI =intarray的地址
    10. mov ecx, LENGTHOF intarray ;数组元素个数,循环次数
    11. mov eax,0 ;eax用来保存和
    12. Ll:
    13. add eax, [edi]
    14. add edi, TYPE intarray ;增量:单个元素的字节数
    15. loop Ll
    16. ;EAX = 000A0000h
    17. INVOKE ExitProcess,0
    18. main ENDP
    19. END main

  • 相关阅读:
    2022年Vue.js面试题汇总及答案【建议收藏】
    Python爬虫实战第一例【一】
    codeforces:dp专练【关于子数组求和 + 选or不选来dp + 二维dp】
    简单理解区块链
    DTCC 2023丨云原生环境下,需要什么样的 ETL 方案?
    乐鑫的ESP32-S3芯片的LE能实现beacon功能吗?
    angular基础总结
    离线配置ohmyzsh nvim tldr conda ssh nvm
    Review-Spring
    Windows wsl2安装Ubuntu
  • 原文地址:https://blog.csdn.net/lm68140318/article/details/134501436