汇编 - 条件

汇编语言中的条件执行是通过几个循环和分支指令完成的.这些指令可以改变程序中的控制流程.在两个场景中观察到条件执行 :

Sr.No.条件指令
1

无条件跳转

这是由JMP指令.条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址.转移控制可以是转发,执行一组新的指令或后退,重新执行相同的步骤.

2

条件跳转

这是由一个一组跳转指令j< condition>视情况而定.条件指令通过中断顺序流来传输控制,并通过更改IP中的偏移值来实现.

让我们在讨论条件指令之前讨论CMP指令.

CMP指令

CMP指令比较两个操作数.它通常用于条件执行.该指令基本上从另一个操作数中减去一个操作数,用于比较操作数是否相等.它不会干扰目标或源操作数.它与条件跳转指令一起用于决策.

语法

CMP destination, source

CMP比较两个数字数据字段.目标操作数可以在寄存器中,也可以在内存中.源操作数可以是常量(立即)数据,寄存器或内存.

示例

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指令执行.条件执行通常涉及将控制转移到不遵循当前正在执行的指令的指令的地址.转移控制可以是转发,执行一组新的指令或反向执行,重新执行相同的步骤.

语法

JMP指令提供标签名称,其中控制流程立即传输. JMP指令的语法是 :

JMP	label

示例

以下代码片段说明了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跳下或跳不是Abo ve/EqualCF
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>的语法一套说明 :

示例,

CMP	AL, BL
JE	EQUAL
CMP	AL, BH
JE	EQUAL
CMP	AL, CL
JE	EQUAL
NON_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   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