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标志位判断。
-
mov edx, 0A523h
-
cmp edx, 0A523h
-
jne L5 ;不发生跳转
-
je L1 ;跳转
以下例子没有使用cmp指令,但是实际上只要是能修改标志位值的指令,都可以做为jne、je的依据。 sub和cmp指令的区别是,sub会修改寄存器和标志位的值,而cmp只是修改标志位的值。
-
mov bx,1234h
-
sub bx,1234h
-
jne L5 ;不发生跳转
-
je L1 ;跳转
以下注意,当CX的值为0FFFFh时,再加1,只会回滚到0而不会等于10000h,不会进位到上一级寄存器ECX。就像时钟那样周而复始。
-
mov cx, 0FFFFh
-
inc cx
-
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是否发生变化,还与目标操作数的容量有关系。
-
MOV AL,0x7EH
-
ADD AL,0x5BH
-
;结果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,提醒结果溢出。
-
mov al, 7EH
-
add ax, 5BH
由于ax是16位,011011001(+217)才9个二进制位,所以结果不溢出OV=0。
总结,溢出和进位本质是在指定大小的空间内,0和1不够存放,无法表示某个数字,必须使用上一级的空间。对于CPU空间是按8、16、32、64位寄存器逐级增加,对于内存空间则是按1、2、4、8字节逐级增加。
高级语言常用的比较语句:
-
if A > B ...
-
while X > 0 and X < 200 ...
-
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 |
-
mov ax, 5
-
cmp ax,10 ; ZF = 0 and CF = 1
-
mov ax,1000
-
mov cx,1000
-
cmp cx, ax ;ZF = 1 and CF = 0
-
mov si,105
-
cmp si, 0 ; ZF = 0 and CF = 0
中文 全称 Visual Studio 1 0 溢出 Overflow flag OV