汇编语言 循环

JMP 指令可用于实现循环。例如,以下代码段可用于执行循环体 10 次。

  1. MOVCL, 10
  2. L1:
  3. <LOOP-BODY>
  4. DECCL
  5. JNZL1

但是,处理器指令集包括一组用于实现迭代的循环指令。

基本的 LOOP 指令语法如下:

  1. LOOP label

其中,label 是标识目标指令的目标标签,如跳转指令中所述。循环指令假定 ECX 寄存器包含循环计数。当执行循环指令时,ECX 寄存器递减,并且控制跳至目标标签,直到 ECX 寄存器的值(即计数器达到零)为止。

上面的代码可以写为:

  1. mov ECX,10
  2. l1:
  3. <loop body>
  4. loop l1

实例

以下程序在屏幕上打印数字 1 到 9:

  1. section .text
  2. global _start ;must be declared for using gcc
  3. _start: ;tell linker entry point
  4. mov ecx,10
  5. mov eax, '1'
  6. l1:
  7. mov [num], eax
  8. mov eax, 4
  9. mov ebx, 1
  10. push ecx
  11. mov ecx, num
  12. mov edx, 1
  13. int 0x80
  14. mov eax, [num]
  15. sub eax, '0'
  16. inc eax
  17. add eax, '0'
  18. pop ecx
  19. loop l1
  20. mov eax,1 ;system call number (sys_exit)
  21. int 0x80 ;call kernel
  22. section .bss
  23. num resb 1

结果如下:

  1. 123456789: