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

CMP 目的操作数, 源操作数

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

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

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

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

CMP指令是创建条件逻辑结构的重要工具。当在条件跳转指令中使用CMP时,汇编语言的执行结果就和IF语句一样。
以下是目的操作数 < 源操作数的举例:

         ;   ZF      CF
mov ax, 5
cmp ax, 10  ;   0       1


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

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

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

            ;ZF      CF
mov ax, 105
cmp ax, 0      ;0       0


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

; 1.编程 统计data 段中数值为8的字节个数,用ax保存统计结果
assume cs:code, ds:data, ss:stackdata segmentdb 8, 11, 8, 1, 8, 5, 63, 38
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss,axmov sp, 128call init_regcall get_eightmov ax, 4C00Hint 21H;============================================
get_eight:          mov si,0mov cx, 8mov ax, 0getEight:     cmp byte ptr ds:[si], 8jne nextNumberinc ax
nextNumber:     inc siloop getEightret
;===============================================
init_reg:       mov bx, datamov ds, bxretcode endsend start


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

; 2.编程 统计data 段中数值大于8的字节个数,用ax保存统计结果
assume cs:code, ds:data, ss:stackdata segmentdb 8, 11, 8, 12, 8, 5, 63, 38
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss,axmov sp, 128call init_regcall get_eightmov ax, 4C00Hint 21H;============================================
get_eight:          mov si,0mov cx, 8mov ax, 0getEight:     cmp byte ptr ds:[si], 8jna nextNumber    ; ja >   na <=inc ax
nextNumber:     inc siloop getEightret
;===============================================
init_reg:       mov bx, datamov ds, bxretcode 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, 1
mov bl, 2
cmp al, bl  →  推理出来 al < bl
sub al, bl  →  影响标志位        1 - 2 = -1    SF 符号标志位置1
mov al, 22H →    34    34 - (-96) = 140    -128 ~ 127
mov bl, A0H      -96
sub al, bl  →   OF标志位   和 SF标志位     溢出标志位置1    符号标志位置1
mov al, 8AH    -118 - 112   =  - 230  溢出   1A 正数
mov bl, 70H
cmp 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 非零跳转(零标志位清零)

汇编语言 CMP指令相关推荐

  1. 汇编语言--cmp指令

    cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果.cmp指令执行后,将对标志寄存器产生影响. 其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果. cmp指令格式:cmp 操作对象 ...

  2. linux汇编语言cmp,汇编语言中cmp指令用法笔记与总结

    这篇文章主要介绍了汇编语言中cmp指令用法,结合实例形式总结分析了汇编语言cmp指令基本功能.使用方法及操作注意事项,需要的朋友可以参考下 本文实例讲述了汇编语言中cmp指令用法.分享给大家供大家参考 ...

  3. 汇编语言-中括号-mov指令-cmp指令-lea指令

    文章目录 1.汇编语言中"[]"的用法 2.mov指令中用到"[]" 3.cmp指令中用到"[]" 4.lea指令 5.test指令 其实& ...

  4. [汇编] 关于补码和汇编语言的cmp指令

    文章目录 复习背景 分析"三码" 反码 补码 引出问题 问题背景下,CF与OF的深入 解决:回到cmp 附赠(debug模式查看标志寄存器) 复习背景 事情是这样的:cmp指令配合 ...

  5. 浮点数不能全等比较吗php,汇编语言FCOM指令:比较浮点数值

    浮点数不能使用 CMP 指令进行比较,因为后者是通过整数减法来执行比较的.取而代之,必须使用 FCOM 指令. 执行 FCOM 指令后,还需要采取特殊步骤,然后再使用逻辑 IF 语句中的条件跳转指令( ...

  6. 汇编语言cmp的问题

    汇编语言cmp 今天,期末复习写了一个简单的比较大小程序,然后我发现在进行了一次cmp指令之后,出现了,cmp比较出错的问题.代码如下 DATA SEGMENTDATA0 DB 9,3,5,7MAX ...

  7. 嵌入式cmp指令的判断标志位_ARM汇编指令集

    ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令. 一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中 ...

  8. 汇编语言常用指令汇总(持续更新)

    汇编语言常用指令汇总(持续更新) 通用数据传送指令 累加器专用指令 有效地址送寄存器指令 标志寄存器传送指令 加法指令 减法指令 乘法指令 除法指令 逻辑指令 移位指令 通用数据传送指令 MOV(Mo ...

  9. 计算机cmp代表什么意思,CMP指令

    CMP指令是由美国斯坦福大学提出的,英文名称是Chip multiprocessors,翻译成中文就是单芯片多处理器,也指多核心其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各 ...

最新文章

  1. R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估
  2. go语言调用python_Golang中调用Python3
  3. 修改build:gradle版本
  4. 微软官方大秀DX12:性能暴涨50%
  5. python的argparse模块parse_known_args()方法的使用
  6. netty java_GitHub - leihuazhe/Java11-Netty-Demo: 基于Java11 构建的 netty 服务端客户端 模块化例子...
  7. ELK logstash的grok 自带的正则匹配、自定义正则 使用
  8. python:数组和列表相互转化
  9. Chrome浏览器查看Axure原型图文件,提示Axure RP Extension for Chrome
  10. 不要等到双十一,MathType公式编辑器提前降价!
  11. 计算机等级考试数据库三级模拟题7
  12. IE浏览器下载文件中文文件名乱码问题解决
  13. python爬取付费漫画_Python爬虫---爬取腾讯动漫全站漫画
  14. 易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)
  15. python爬取美女_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)附学习教程
  16. 【CTF】【渗透】【msf】三、绕过杀毒软件技巧
  17. No Feign Client for loadBalancing defined.错误
  18. 试论软件的可靠性及其保证
  19. 棱镜门事件将唤起用户对个人隐私的关注和重视
  20. 征婚网站php免费源码,php交友网站系统正式版php征婚网站模板

热门文章

  1. Python 与神奇的数学之龙形曲线
  2. 在HTML中添加背景音乐
  3. 基于C语言的G代码解释器,G-Code
  4. 免费的音频编辑器为Mac用户
  5. 4K Stogram for Mac,Instagram下载
  6. IDEA同款数据库管理工具,提示太全了,用起来贼香!
  7. SylixOS GSLX680触摸屏驱动移植
  8. 360Lib中的坐标系
  9. 转载:mavlink 磁力计校准部分分析
  10. smbus读取spd方法