当前位置: 首页 > 文档资料 > 汇编中文教程 >

条件(Conditions)

优质
小牛编辑
123浏览
2023-12-01

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

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
JCJump If CarryCF
JNCJump If No CarryCF
JOJump If OverflowOF
JNOJump If No OverflowOF
JP/JPE跳跃奇偶校验或跳跃奇偶校验PF
JNP/JPO跳跃没有奇偶校验或跳跃奇偶校验PF
JSJump 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