循環也是改變指令執行順序的一種方式,循環操作重複的執行,直到滿足條件。我們可以使用條件跳轉指令來創建循環,但事實上彙編語言中有更簡單的循環指令系列。
循環指令使用ECX寄存器作為計數器,隨著循環指令的執行自動遞減它的值,並且不會影響EFLAGS寄存器的標誌位,當ecx寄存器值到達0時,0標誌不會被設置。循環指令有如下:loop(循環直到ecx寄存器為0)、loope/loopz(循環直到ecx寄存器為0或沒有設置ZF標誌)、loopne/loopnz(循環直到ecx寄存器為0或設置了ZF標誌)。
loope/loopz和loopne/loopnz指令提供了監視0標誌的附加功能。指令的使用格式為:
loop addr
addr是要跳轉到的程序代碼位置的標籤名稱。在循環開始之前,必須在ecx寄存器中設置執行迭代的次數值。如下:
#loop.s
.section .text
.globl _start
_start:
movl $10, %ecx
movl $0, %eax
here_loop:
addl %ecx, %eax
loop here_loop
movl %eax, %ebx
movl $1, %eax
int $0x80</span>
程序簡單循環計算0到10的累加和,然會程序返回累加值。make,運行結果如下:
$ make
as -o loop.o loop.s --gstabs
ld -o loop loop.o
$ ./loop
$ echo $?
55
$