操作碼 |
指令 |
說明 |
E2 cb |
LOOP rel8 |
遞減計數;計數 0 時短跳轉 |
E1 cb |
LOOPE rel8 |
遞減計數;計數 0 且 ZF=1 時短跳轉 |
E1 cb |
LOOPZ rel8 |
遞減計數;計數 0 且 ZF=1 時短跳轉 |
E0 cb |
LOOPNE rel8 |
遞減計數;計數 0 且 ZF=0 時短跳轉 |
E0 cb |
LOOPNZ rel8 |
遞減計數;計數 0 且 ZF=0 時短跳轉 |
將 ECX 或 CX 暫存器用作計數器,執行循環操作。LOOP 指令每執行一次,計數暫存器遞減,然後檢查是否為 0。如果計數為 0,則終止循環,並繼續執行程式中 LOOP 指令後面的指令。如果計數器不為零,則執行近跳轉,跳轉到目標(跳轉目標)運算元,假定它是位於循環開頭的指令。如果地址大小屬性是 32 位,則將 ECX 暫存器用作計數暫存器;否則使用 CX 暫存器。
目標指令使用相對偏移量(相對於 EIP 暫存器中指令指針目前值的有符號偏移量)指定。彙編程式碼中此偏移量通常指定為標號,但是在機器程式碼級別,它編碼為有符號 8 位立即數,並加到指令指針上。此指令可以使用 -128 到 +127 的偏移量。
某些形式的循環指令 (LOOPcc) 還可以將 ZF 標誌用作循環終止條件,在計數變為零之前終止循環。在這些形式的指令中,條件程式碼 (cc) 與每條指令關聯,用於指明測試條件。這裡,LOOPcc 指令本身不影響 ZF 標誌的狀態;ZF 標誌由循環中的其它指令更改。
IF AddressSize 32
THEN
Count is ECX;
ELSE (* AddressSize 16 *)
Count is CX;
FI;
Count Count - 1;
IF instruction is not LOOP
THEN
IF (instruction LOOPE) OR (instruction LOOPZ)
THEN
IF (ZF =1) AND (Count 0)
THEN BranchCond 1;
ELSE BranchCond 0;
FI;
FI;
IF (instruction LOOPNE) OR (instruction LOOPNZ)
THEN
IF (ZF =0 ) AND (Count 0)
THEN BranchCond 1;
ELSE BranchCond 0;
FI;
FI;
ELSE (* instruction LOOP *)
IF (Count 0)
THEN BranchCond 1;
ELSE BranchCond 0;
FI;
FI;
IF BranchCond 1
THEN
EIP EIP + SignExtend(DEST);
IF OperandSize 16
THEN
EIP EIP AND 0000FFFFH;
FI;
ELSE
Terminate loop and continue program execution at EIP;
FI;
無。
#GP(0) - 如果跳轉的目標偏移量超出程式碼段的限制。
無。
無。