汇编语言中的条件执行是通过几个循环和分支指令完成的.这些指令可以改变程序中的控制流程.在两个场景中观察到条件执行 :
Sr.No. | 条件指令 |
---|---|
1 | 无条件跳转 这是由JMP指令.条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址.转移控制可以是转发,执行一组新的指令或后退,重新执行相同的步骤. |
2 | 条件跳转 这是由一个一组跳转指令j< condition>视情况而定.条件指令通过中断顺序流来传输控制,并通过更改IP中的偏移值来实现. |
让我们在讨论条件指令之前讨论CMP指令.
CMP指令
CMP指令比较两个操作数.它通常用于条件执行.该指令基本上从另一个操作数中减去一个操作数,用于比较操作数是否相等.它不会干扰目标或源操作数.它与条件跳转指令一起用于决策.
语法
CMP destination, source
CMP比较两个数字数据字段.目标操作数可以在寄存器中,也可以在内存中.源操作数可以是常量(立即)数据,寄存器或内存.
示例
CMP DX,00 ; Compare the DX value with zeroJE L7 ; If yes, then jump to label L7..L7: ...
CMP通常用于比较计数器值是否已达到循环运行的次数.考虑以下典型条件 :
INCEDXCMPEDX, 10; Compares whether the counter has reached 10JLELP1 ; If it is less than or equal to 10, then jump to LP1
无条件跳转
如前所述,这个由JMP指令执行.条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址.转移控制可以是转发,执行一组新的指令或反向执行,重新执行相同的步骤.
语法
JMP指令提供标签名称,其中控制流程立即传输. JMP指令的语法是 :
JMPlabel
示例
以下代码片段说明了JMP指令 :
MOV AX, 00 ; Initializing AX to 0MOV BX, 00 ; Initializing BX to 0MOV CX, 01 ; Initializing CX to 1L20:ADD AX, 01 ; Increment AXADD BX, AX ; Add AX to BXSHL CX, 1 ; shift left CX, this in turn doubles the CX valueJMP 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 | 跳下或跳不是Abo ve/Equal | CF |
JBE/JNA | 跳低于/等于或跳不高于 | AF,CF |
以下条件跳转指令有特殊用途并检查flags : 的值;
指令 | 描述 | 标志测试 |
---|---|---|
JXCZ | 如果CX为零则跳转 | 无 |
JC | 跳转如果携带 | CF |
JNC | 跳转如果没有携带 | CF |
JO | 跳过如果溢出 | OF |
JNO | 跳过如果没有溢出 | OF |
JP/JPE | 跳跃奇偶校验或跳跃奇偶校验 | PF |
JNP/JPO | 跳跃没有奇偶校验或跳跃奇偶校验 | PF |
JS | 跳转符号(负值) | SF |
JNS | 跳转无符号(正值) | SF |
J< condition>的语法一套说明 :
示例,
CMPAL, BLJEEQUALCMPAL, BHJEEQUALCMPAL, CLJEEQUALNON_EQUAL: ...EQUAL: ...
示例
以下程序显示三个变量中最大的一个.变量是两位数的变量.三个变量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 80hsection.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