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