Assembly 条件 - Assembly汇编
在汇编语言中的条件执行是通过几个循环和分支指令。这些指令可以改变在程序的控制流。有条件的执行过程中观察到两种情况:
SN | 条件说明 |
---|---|
1 | 无条件跳转 这是通过JMP指令。有条件的执行往往涉及控制权移交给一个指令的地址不遵循当前执行的指令。控制转移可能会执行一组新的指令或向后,以便重新执行相同的步骤。 |
2 | 条件跳转 这是由一组跳转指令Ĵ<条件>视条件而定。条件指令控制转移,打破了连续流程,他们这样做是通过改变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
有条件跳转
如果某些指定的条件跳转条件满足时,控制流程转移到目标指令。有多个条件跳转指令,根据条件和数据。
以下是条件跳转指令用于有符号数据用于算术运算:
Instruction | Description | Flags tested |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JG/JNLE | Jump Greater or Jump Not Less/Equal | OF, SF, ZF |
JGE/JNL | Jump Greater or Jump Not Less | OF, SF |
JL/JNGE | Jump Less or Jump Not Greater/Equal | OF, SF |
JLE/JNG | Jump Less/Equal or Jump Not Greater | OF, SF, ZF |
以下是条件跳转指令用于无符号数据用于进行逻辑运算:
Instruction | Description | Flags tested |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JA/JNBE | Jump Above or Jump Not Below/Equal | CF, ZF |
JAE/JNB | Jump Above/Equal or Jump Not Below | CF |
JB/JNAE | Jump Below or Jump Not Above/Equal | CF |
JBE/JNA | Jump Below/Equal or Jump Not Above | AF, CF |
下列条件跳转指令有特殊的用途及检查的标志值:
Instruction | Description | Flags tested |
---|---|---|
JXCZ | Jump if CX is Zero | 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 | Jump Parity or Jump Parity Even | PF |
JNP/JPO | Jump No Parity or Jump Parity Odd | PF |
JS | Jump Sign (negative value) | SF |
JNS | Jump No Sign (positive value) | SF |
在J<条件>的指令集的语法:
例如,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
实例:
下面的程序显示的最大的三个变量。的变量均以两位数变量。这三个变量num1, num2 和num3值分别为47,72和31:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry yiibai
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num3]
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