博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编语言 CMP指令
阅读量:3961 次
发布时间:2019-05-24

本文共 3131 字,大约阅读时间需要 10 分钟。

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。

指令格式:

CMP 目的操作数, 源操作数

标志位 当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下表所示:

CMP结果 ZF CF
目的操作数 < 源操作数 0 1
目的操作数 > 源操作数 0 0
目的操作数 = 源操作数 1 0

如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下表所示:

CMP结果 标志位
目的操作数 < 源操作数 SF ≠ OF
目的操作数 > 源操作数 SF = OF
目的操作数 = 源操作数 ZF = 1

CMP指令是创建条件逻辑结构的重要工具。当在条件跳转指令中使用CMP时,汇编语言的执行结果就和IF语句一样。

以下是目的操作数 < 源操作数的举例:

;	ZF      CFmov ax, 5cmp ax, 10	;	0       1

在这里插入图片描述

以下是目的操作数 = 源操作数的举例:

;	ZF      CF			mov ax, 1000			mov cx, 1000			cmp cx, ax  ;   1       0

在这里插入图片描述

以下是目的操作数 > 源操作数的举例:

;ZF      CFmov ax, 105cmp ax, 0      ;0       0

在这里插入图片描述

使用CMP指令统计data 段中数值为8的字节个数,用ax保存统计结果。

; 1.编程 统计data 段中数值为8的字节个数,用ax保存统计结果assume cs:code, ds:data, ss:stackdata segment		db 8, 11, 8, 1, 8, 5, 63, 38data endsstack segment stack		db 128 dup(0)stack endscode segment		start: mov ax, stack				mov ss,ax				mov sp, 128								call init_reg								call get_eight								mov ax, 4C00H				int 21H				;============================================get_eight:							mov si,0				mov cx, 8				mov ax, 0				getEight:		cmp byte ptr ds:[si], 8				jne nextNumber				inc axnextNumber:		inc si				loop getEight								ret;===============================================init_reg:						mov bx, data				mov ds, bx				ret				code endsend start

在这里插入图片描述

使用 CMP指令 统计data 段中数值大于8的字节个数,用ax保存统计结果

; 2.编程 统计data 段中数值大于8的字节个数,用ax保存统计结果assume cs:code, ds:data, ss:stackdata segment		db 8, 11, 8, 12, 8, 5, 63, 38data endsstack segment stack		db 128 dup(0)stack endscode segment		start: mov ax, stack				mov ss,ax				mov sp, 128								call init_reg								call get_eight								mov ax, 4C00H				int 21H				;============================================get_eight:							mov si,0				mov cx, 8				mov ax, 0				getEight:		cmp byte ptr ds:[si], 8				jna nextNumber    ; ja >   na <=				inc axnextNumber:		inc si				loop getEight								ret;===============================================init_reg:						mov bx, data				mov ds, bx				ret				code endsend start

在这里插入图片描述

CMP ax, bx 修改标志位 符号描述
ax = bx ZF = 1 相等
ax != bx ZF = 0 不相等
ax < bx CF = 1 小于
ax >= bx CF = 0 大于等于
ax > bx CF = 0 并且 ZF = 0 大于
ax <= bx CF = 1 或者 ZF = 1 小于等于

基于有符号的举例:

mov al, 1mov bl, 2cmp al, bl  →  推理出来 al < blsub al, bl  →  影响标志位        1 - 2 = -1    SF 符号标志位置1
mov al, 22H →    34    34 - (-96) = 140    -128 ~ 127mov bl, A0H      -96sub al, bl  →   OF标志位   和 SF标志位     溢出标志位置1    符号标志位置1
mov al, 8AH    -118 - 112   =  - 230  溢出   1A 正数mov bl, 70Hcmp al, bl           OF = 1  SF  = 0    溢出标志位置1   符号标志位置0

总结:基于有符号比较

设 cmp al, bl如果 SF = 1  OF = 0那么 al < bl如果SF = 1 OF =1那么 al > bl如果 SF = 0 OF = 1     因为 SF = 0不等式应该为 al - bl > 0    al > bl        当OF = 1 成立时,那么al < bl如果SF = 0 OF = 0    那么 al - bl > 0 得到 al > bl

如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。

如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。

基于无符号数比较的跳转

助记符 说明
JB 小于跳转
JNB 不小于跳转
JNBE 不小于或等于跳转
JA 大于跳转
JNA 不大于跳转
JNAE 不大于或等于跳转

基于相等性的跳转

助记符 说明
JE 相等跳转
JNE 不相等跳转
JCXZ CX = 0 跳转
JECXZ ECX = 0 跳转
JRCXZ RCX = 0 跳转(64模式)

基于有符号数比较的跳转

助记符 说明
JG 大于跳转
JL 小于跳转
JNLE 不小于或等于跳转
JNGE 不大于活等于跳转
JGE 大于或等于跳转
JLE 小于或等于跳转
JNL 不小于跳转
JNG 不大于跳转

基于进位和零标志位的跳转

助记符 说明
JC 进位跳转(进位标志位置1)
JNC 无进位跳转(进位标志位清零)
JZ 为零跳转(零标志位置1)
JNZ 非零跳转(零标志位清零)

转载地址:http://xbqzi.baihongyu.com/

你可能感兴趣的文章
杭电ACM——天上掉馅饼(DP)
查看>>
杭电ACM——1086,You can Solve a Geometry Problem too(思维)
查看>>
杭电ACM——2057,A + B Again(思维)
查看>>
codeforces——1097B,Petr and a Combination Lock(搜索)
查看>>
杭电ACM——2069,Coin Change(DP)
查看>>
杭电ACM——2110,Crisis of HDU(母函数)
查看>>
杭电AM——2152,Fruit(母函数)
查看>>
杭电ACM——2566,统计硬币(DP)
查看>>
堆栈(数据结构)
查看>>
队列(数据结构)
查看>>
Mule ESB-Basic Studio Tutorial
查看>>
Mule ESB-Content-Based Routing Tutorial(1)
查看>>
Mule ESB-Content-Based Routing Tutorial(2)
查看>>
Mule ESB-Content-Based Routing Tutorial(3)
查看>>
年末项目经验总结
查看>>
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
敏捷开发实践(3)-我们为什么需要持续集成?
查看>>