条件(Conditions)
汇编语言中的条件执行是通过几个循环和分支指令完成的。 这些指令可以改变程序中的控制流程。 在两种情况下观察到条件执行 -
Sr.No. | 条件指令 |
---|---|
1 | Unconditional jump 这是由JMP指令执行的。 条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址。 控制转移可以是转发,执行一组新指令或反向转移,以重新执行相同的步骤。 |
2 | Conditional jump 这是由一组跳转指令j 根据条件执行的。 条件指令通过中断顺序流来传输控制,并通过更改IP中的偏移值来完成。 |
在讨论条件指令之前,让我们讨论CMP指令。
CMP指令
CMP指令比较两个操作数。 它通常用于条件执行。 该指令基本上从另一个操作数中减去一个操作数,以比较操作数是否相等。 它不会干扰目标或源操作数。 它与条件跳转指令一起用于决策。
语法 (Syntax)
CMP destination, source
CMP比较两个数字数据字段。 目标操作数可以在寄存器中,也可以在内存中。 源操作数可以是常量(立即)数据,寄存器或存储器。
例子 (Example)
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
CMP通常用于比较计数器值是否已达到循环需要运行的次数。 考虑以下典型情况 -
INC EDX
CMP EDX, 10 ; Compares whether the counter has reached 10
JLE LP1 ; If it is less than or equal to 10, then jump to LP1
无条件跳转
如前所述,这是由JMP指令执行的。 条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址。 控制转移可以是转发,执行一组新指令或反向转移,以重新执行相同的步骤。
语法 (Syntax)
JMP指令提供标签名称,其中控制流立即传输。 JMP指令的语法是 -
JMP label
例子 (Example)
以下代码片段说明了JMP指令 -
MOV AX, 00 ; Initializing AX to 0
MOV BX, 00 ; Initializing BX to 0
MOV CX, 01 ; Initializing CX to 1
L20:
ADD AX, 01 ; Increment AX
ADD BX, AX ; Add AX to BX
SHL CX, 1 ; shift left CX, this in turn doubles the CX value
JMP L20 ; repeats the statements
有条件的跳转
如果在条件跳转中满足某些指定条件,则控制流被转移到目标指令。 根据条件和数据,有许多条件跳转指令。
以下是用于算术运算的带符号数据的条件跳转指令 -
指令 | 描述 | 标志测试 |
---|---|---|
JE/JZ | 跳跃等于或跳零 | ZF |
JNE/JNZ | 跳不等或跳不零 | ZF |
JG/JNLE | 跳得更大或跳不少/等 | OF, SF, ZF |
JGE/JNL | 跳跃更大/相等或跳跃不少 | OF, SF |
JL/JNGE | 跳得少或跳得不大/等于 | OF, SF |
JLE/JNG | 跳得少/等等或跳得不大 | OF, SF, ZF |
以下是用于逻辑运算的无符号数据的条件跳转指令 -
指令 | 描述 | 标志测试 |
---|---|---|
JE/JZ | 跳跃等于或跳零 | ZF |
JNE/JNZ | 跳不等或跳不零 | ZF |
JA/JNBE | 跳到上方或跳不低于/等于 | CF, ZF |
JAE/JNB | 跳到上方/等于或跳不到下方 | CF |
JB/JNAE | 跳到下面或跳不高于/等于 | CF |
JBE/JNA | 跳低于/等于或跳不高于 | AF, CF |
以下条件跳转指令有特殊用途并检查标志的值 -
指令 | 描述 | 标志测试 |
---|---|---|
JXCZ | 如果CX为零则跳转 | none |
JC | Jump If Carry | CF |
JNC | Jump If No Carry | CF |
JO | Jump If Overflow | OF |
JNO | Jump If No Overflow | OF |
JP/JPE | 跳跃奇偶校验或跳跃奇偶校验 | PF |
JNP/JPO | 跳跃没有奇偶校验或跳跃奇偶校验 | PF |
JS | Jump Sign (negative value) | SF |
JNS | 跳号码(正值) | SF |
J 指令集的语法 -
例,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
例子 (Example)
以下程序显示三个变量中最大的一个。 变量是两位数的变量。 三个变量num1,num2和num3分别具有值47,22和31 -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]
check_third_num:
cmp ecx, [num3]
jg _exit
mov ecx, [num3]
_exit:
mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,largest
mov edx, 2
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1
int 80h
section .data
msg db "The largest digit is: ", 0xA,0xD
len equ $- msg
num1 dd '47'
num2 dd '22'
num3 dd '31'
segment .bss
largest resb 2
编译并执行上述代码时,会产生以下结果 -
The largest digit is:
47