汇编语言 CMP指令

发布者:翩翩轻舞最新更新时间:2022-10-18 来源: csdn关键字:汇编语言  操作数 手机看文章 扫描二维码
随时随地手机看文章

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


指令格式:


CMP 目的操作数, 源操作数


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

image.png

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

image.png

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

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


; ZF      CF

mov ax, 5

cmp ax, 10 ; 0       1

在这里插入图片描述

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


                        ; ZF      CF

mov ax, 1000

mov cx, 1000

cmp 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:stack


data segment

db 8, 11, 8, 1, 8, 5, 63, 38

data ends


stack segment stack

db 128 dup(0)

stack ends


code 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 ax

nextNumber: inc si

loop getEight

ret

;===============================================

init_reg:

mov bx, data

mov ds, bx

ret

code ends


end start


在这里插入图片描述

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


; 2.编程 统计data 段中数值大于8的字节个数,用ax保存统计结果

assume cs:code, ds:data, ss:stack


data segment

db 8, 11, 8, 12, 8, 5, 63, 38

data ends


stack segment stack

db 128 dup(0)

stack ends


code 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 ax

nextNumber: inc si

loop getEight

ret

;===============================================

init_reg:

mov bx, data

mov ds, bx

ret

code ends


end start

在这里插入图片描述

image.png

基于有符号的举例:


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


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


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


基于无符号数比较的跳转

image.png

基于相等性的跳转

image.png

基于有符号数比较的跳转

image.png

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

image.png

关键字:汇编语言  操作数 引用地址:汇编语言 CMP指令

上一篇:汇编语言 pushf 和 popf指令
下一篇:汇编语言 8086+8255A仿真中断控制

推荐阅读最新更新时间:2024-11-09 11:06

TQ2440 学习笔记—— 13、GPIO 接口【实验:用汇编语言实现】
GPIO 操作实例:LED 和 按键 1、使用汇编代码点亮一个LED 操作步骤 a、编写源程序(程序) b、生成可执行程序(Makefile) c、烧写程序(USB 下载线烧写) d、运行程序 a、编写源程序 虽然是汇编代码,但是程序很简单,就不解释啦! b、Makefile make 指令比较 第 1 行中文件led_on.bin 和文件 led_on.S 的时间,如果 led_on.S 的时间 比 led_on.bin 的时间新(led_on.bin 未生成时,此条件默认成立),则执行第2,3,4行的命令重新生成led_on.bin 。也可以不用指令make,而直接一条一条的执行2,3,
[单片机]
TQ2440 学习笔记—— 13、GPIO 接口【实验:用<font color='red'>汇编语言</font>实现】
汇编语言 ADC指令和SBB指令
ADC指令 ADC(带进位加法)指令将源操作数和进位标志位的值都与目的操作数相加。该指令格式与ADD指令一样,且操作数大小必须相同。 例如下述指令实现两个16位整数相加(FFFFH + 1000H),产生的和分别存入DX:AX assume cs:code, ds:data, ss:stack data segment db 256 dup(0) data ends stack segment stack db 128 dup(0) stack ends code segment start: mov ax, stack mov ss, ax mov sp, 128
[单片机]
<font color='red'>汇编语言</font> ADC<font color='red'>指令</font>和SBB<font color='red'>指令</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved