循環指令

循環也是改變指令執行順序的一種方式,循環操作重複的執行,直到滿足條件。我們可以使用條件跳轉指令來創建循環,但事實上彙編語言中有更簡單的循環指令系列。

循環指令使用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
$

书籍推荐