x86汇编_JE、JNE、JCXZ 和 JECXZ 指令_笔记_34

基于左右操作数或寄存器值的跳转
助记符 英文翻译 说明
JE Jump if left Equals right 相等跳转 (左操作数=右操作数)
JNE Jump if left Not Equals right 不相等跳转 (左操作数≠右操作数)
JCXZ Jump if CX equals Zero CX=0 跳转
JECXZ Jump if ECX equals Zero ECX=0 跳转
JRCXZ Jump if RCX equals Zero RCX=0 跳转(64 位模式)

下述示例使用了 JE、JNE、JCXZ 和 JECXZ 指令。仔细阅读注释,以保证理解为什么条件跳转得以实现(或不实现)。

以下例子用0A523h减去0A523h,如果等于0,则ZF=1,jne和je则根据ZF标志位判断。

 

 
  1. mov edx, 0A523h
  2. cmp edx, 0A523h
  3. jne L5 ;不发生跳转
  4. je L1 ;跳转
 

以下例子没有使用cmp指令,但是实际上只要是能修改标志位值的指令,都可以做为jne、je的依据。 sub和cmp指令的区别是,sub会修改寄存器和标志位的值,而cmp只是修改标志位的值。

 
  1. mov bx,1234h
  2. sub bx,1234h
  3. jne L5 ;不发生跳转
  4. je L1 ;跳转
 

以下注意,当CX的值为0FFFFh时,再加1,只会回滚到0而不会等于10000h,不会进位到上一级寄存器ECX。就像时钟那样周而复始。

 
  1. mov cx, 0FFFFh
  2. inc cx
  3. jcxz L2 ;跳转
 
  • x86汇编_压缩BCD码_DAA指令_DAS指令_笔记57

  • x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56

  • x86汇编_BCD码_笔记55

  • x86汇编_扩展加减法_笔记54

  • x86汇编_DIV / IDIV除法指令_笔记53

  • x86汇编_MUL/IMUL乘法指令_笔记52

  • x86汇编_SHLD/SHRD双精度左右移指令_笔记49

  • x86汇编_循环左/右移_带进位的循环左/右移_笔记48

  • x86汇编_逻辑左/右移_算术左/右移_笔记47

  • x86汇编_移位和循环移位指令简介_笔记46

  • x86汇编_MASM的IF伪指令_笔记44

  • x86汇编_条件控制伪指令简介_笔记43

  • x86汇编_Irvine32链接库的子过程isdigit源代码讲解_笔记42

  • x86汇编_表驱动选择_笔记_41

  • x86汇编_WHILE循环_笔记_40

  • x86汇编_短路求值-AND / OR运算符_笔记_39

  • x86汇编_LOOPZ / LOOPE,LOOPNZ / LOOPNE_笔记_38

  • x86汇编_高级语言的IF语句_笔记_37

  • x86汇编_条件跳转示例_笔记_36

  • x86汇编_无符号与有符号跳转_笔记_35

  • x86汇编_JE、JNE、JCXZ 和 JECXZ 指令_笔记_34

  • x86汇编_CPU跳转指令汇总_笔记_33

  • x86汇编_条件跳转简介_笔记_32

  • x86汇编_补码_笔记_31

  • x86汇编_标志寄存器OF和CF的区别_笔记_30

  • x86汇编_二进制减法_笔记_29

  • x86汇编_CMP指令_笔记_28

  • x86汇编_Visual Studio标志位说明_笔记_27

  • x86汇编_布尔指令-AND / OR / XOR / NOT / TEST_笔记_26

  • x86汇编_Irvine32链接库过程详细说明_笔记_25

  • x86汇编_Irvine32链接库_笔记24

  • x86汇编_VS2019汇编环境添加Irvine32外部链接库_笔记_23

  • x86汇编_uses运算符_笔记_22

  • x86汇编_利用子过程做整数数组求和_笔记_21

  • x86汇编_CALL和RET指令及过程调用嵌套_笔记_20

  • x86汇编_用独立的过程给三个整数求和_笔记_19

  • x86汇编_定义并使用过程_笔记_18

  • x86汇编_堆栈操作基础_笔记_17

  • x86汇编_复制字符串_笔记_16

  • x86汇编_数组元素汇总_笔记_15

    • x86汇编_LOOP指令_笔记_14

    • x86汇编_指针_笔记_13

    • x86汇编_间接操作数是遍历数组的理想工具_笔记_12

    • x86汇编_间接寻址-间接操作数_笔记_11

    • x86汇编_type/lengthof/sizeof运算符_笔记_10

    • x86汇编_PTR运算符_笔记_9

    • x86汇编_OFFSET运算符_笔记_8

    • x86汇编_直接偏移操作数_笔记7

    • x86汇编_指令集大全_笔记_6

    • x86汇编_计算数组和字符串大小_笔记_5

    • x86汇编_小端顺序_笔记_4

    • x86汇编_显示汇编代码的机器码_笔记_2

    • x86汇编_数据类型_笔记_3

    • x86汇编_代码基础模板_笔记_1

    https://blog.csdn.net/qq_16774199/category_11673627.html

    标志位值的跳转
    助记符 英文翻译 说明 标志位/寄存器
    JZ Jump if Zero 为零跳转 ZF=1
    JNZ Jump if Not Zero 非零跳转 ZF=0
    JC Jump if Carry 进位跳转 CF=1
    JNC Jump if Not Carry 无进位跳转 CF=0
    JO Jump if Overflow 溢出跳转 OF=1
    JNO Jump if Not Overflow 无溢出跳转 OF=0
    JS Jump if having Sign (Positive / Negative) 有符号跳转 SF=1
    JNS Jump if Not having Sign 无符号跳转 SF=0
    JP Jump if Parity even 偶校验跳转 PF=1
    JNP Jump if Not Parity even(odd) 奇校验跳转 PF=0

     

    左右操作数的跳转
    助记符 英文翻译 说明
    JE Jump if left Equals right 相等跳转 (左操作数=右操作数)
    JNE Jump if left Not Equals right 不相等跳转 (左操作数≠右操作数)
    JCXZ Jump if CX equals Zero CX=0 跳转
    JECXZ Jump if ECX equals Zero ECX=0 跳转
    JRCXZ Jump if RCX equals Zero RCX=0 跳转(64 位模式)

     

    无符号数比较的跳转
    助记符 英文翻译 说明
    JA Jump if left Above right 大于跳转(若 leftOp > rightOp)
    JNBE Jump if left Not Below or Equal right 不小于或等于跳转(与 JA 相同)
    JB Jump if left Below right 小于跳转(若 leftOp < rightOp)
    JNAE Jump if left Not Above or Equal right 不大于或等于跳转(与 JB 相同)
    JAE Jump if left Above or Equal right 大于或等于跳转(若 leftOp ≥ rightOp)
    JNB Jump if left Not Below right 不小于跳转(与 JAE 相同)
    JBE Jump if left Below or Euqal right 小于或等于跳转(若 leftOp ≤ rightOp)
    JNA Jump if left Not Above right 不大于跳转(与 JBE 相同)

     

    有符号数比较的跳转
    助记符 英文翻译 说明
    JG Jump if left Greater than right 大于跳转(若 leftOp > rightOp)
    JNLE Jump if left Not Less than or Equal right 不小于或等于跳转(与 JG 相同)
    JL Jump if left Less than right 小于跳转(若 leftOp < rightOp)
    JNGE Jump if left Not Greater than or Euqal right 不大于或等于跳转(与 JL 相同)
    JLE Jump if left Less than or Euqal right 小于或等于跳转(若 leftOp ≤ rightOp)
    JNG Jump if left Not Greater than right 不大于跳转(与 JLE 相同)
    JGE Jump if left Greater than or Equal right 大于或等于跳转(若 leftOp ≥ rightOp)
    JNL Jump if left Not Less than right 不小于跳转(与 JGE 相同)

 

 

OF在visual studio里叫OV,CF在visual studio里叫CY。

在寄存器和内存里永远只有0和1,可以理解为计算机是不知道正负的。11111110当作无符号数看待是254,当作有符号数看待是-2。是人按照约定的规则来评判一段内存或寄存器里的内容,才有所谓的无符号、正和负。

虽然计算机无所谓正负数,但人有所谓,这就是OF和CF产生的原因。

数字加减的过程中可能OF和CF会同时变化。把数字当有符号时要观察OF的变化而不用理会CF,把数字当作无符号时要观察CF的变化而不必理会OF。

OF和CF是否发生变化,还与目标操作数的容量有关系。

 
  1. MOV AL,0x7EH
  2. ADD AL,0x5BH
  3. ;结果AL=D9
 

以上结果OF=1溢出,CF=0没有进位(也可以理解为没有溢出)。

把7E和5B视为无符号,那么AL最大能表示FF(255),D9(217)可以放进AL寄存器。因为AL是8位,最大储存11111111,D9的二进制是11011001,用AL足够储存,无需进位因此CY=0。

当把一组二进制数视为有符号数,二进制第一位是0的视为正数,是1的视为负数。

把7E和5B视为有符号,按照补码标准它们都是正数,结果是+217。此时AL最大能表示7F(127),D9(217)无法表示。因为AL是8位寄存器,最多只能储存01111111(+127),D9的二进制11011001按照补码标准应该解读为-39,但这里属于有符号运算,必须把结果解读为+217,按补码标准只有011011001(9个位)才能表示,AL寄存放不下9个位,所以OV=1,提醒结果溢出。

 
  1. mov al, 7EH
  2. add ax, 5BH
 

由于ax是16位,011011001(+217)才9个二进制位,所以结果不溢出OV=0。

总结,溢出和进位本质是在指定大小的空间内,0和1不够存放,无法表示某个数字,必须使用上一级的空间。对于CPU空间是按8、16、32、64位寄存器逐级增加,对于内存空间则是按1、2、4、8字节逐级增加。

 

高级语言常用的比较语句:

 
  1. if A > B ...
  2. while X > 0 and X < 200 ...
  3. if check_for_error(N) = true
 

x86汇编用cmp指令比较整数,因为字符也属于整数,所以也可以使用cmp指令。浮点数需要其它指令来比较,在《汇编语言-基于x86处理器》第12章介绍。

cmp 目标操作数,源操作数

cmp指令用目标操作数减去源操作数,根据结果来确定溢出、符号、零、进位、辅助进位和奇偶标志位,但不会真的去改变目标操作数,仅改变了标志位。汇编的cmp指令相当于高级语言的IF语句。

比较两个无符号数
CMP结果 ZF CF
目的操作数 < 源操作数 0 1
目的操作数 > 源操作数 0 0
目的操作数 = 源操作数 1 0
比较两个有符号数
CMP结果 标志位
目的操作数 < 源操作数 SF ≠ OF
目的操作数 > 源操作数 SF=OF
目的操作数 = 源操作数 ZF=1

 

 
  1. mov ax, 5
  2. cmp ax,10 ; ZF = 0 and CF = 1
 
 
  1. mov ax,1000
  2. mov cx,1000
  3. cmp cx, ax ;ZF = 1 and CF = 0
 
 
  1. mov si,105
  2. cmp si, 0 ; ZF = 0 and CF = 0
     
    中文 全称 Visual Studio 1 0
    溢出 Overflow flag OV
posted @ 2024-10-24 14:17  CharyGao  阅读(41)  评论(0编辑  收藏  举报