微机原理及应用实验——数据比较及排序程序

比较指令CMP

格式

  • CMP OPRD1,OPRD2

操作

  • OPRD1- OPRD2

在这里插入图片描述
两个数的大小由OF和SF共同决定:
在这里插入图片描述

指令执行的结果不影响目标操作数,仅影响6个标志位!

用途

用于比较两个数的大小,可作为条件转移指令转移的条件

案例

在内存数据段从DATA开始的单元中存放了两个8位无符号数,试比较他们的大小,并将大的输送MAX单元。

在这里插入图片描述
核心代码:

    LEA BX, DATA ;DATA偏移地址送BX
    MOV AL, [BX] ;第一个无符号数送AL
    INC BX ;BX加1,指向第二个数
    CMP AL, [BX] ;两个无符号数进行比较
    JNC DONE ;若CF=0(无进位,表示第一一个数大),转向DONE
    MOV AL, [BX] ;否则,第二个无符号数送AL
DONE : 
    MOV MAX,AL ;将较大的无符号数送MAX
    HLT ;停止

转移指令

转移指令是通过修改指令的偏移地址或段地址及偏移地址实现程序的转移的一类指令。

转移指令又分为无条件转移指令和有条件转移指令:

  • 无条件转移指令: 无条件转移到目标地址,执行新的指令
  • 条件转移指令: 在具备一定条件的情况下转移到目标地址

无条件转移指令

在这里插入图片描述

寻找目标地址的方法有两种:

  • 直接的方式;
  • 间接的方式

无条件段内转移

转移的目标地址在当前代码段内,段地址不改变。即目标地址是16位偏移地址。

在这里插入图片描述

段内直接转移

转移的目标地址由指令直接给出

格式

JMP Label

段内转移时的标号前可加运算符NEAR,也可不加,省略时为段内转移。

在这里插入图片描述
下一条要执行指令的偏移地址:

  • 新IP=当前IP+位移量(CS不变)
案例

在这里插入图片描述

段内间接转移

转移的目标地址存放在某个16位寄存器或存储器的某两个单元中

格式

JMP OPRD

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述

无条件段间转移

转移的目标地址不在当前代码段内,目标地址为32位,包括段地址和偏移地址

在这里插入图片描述

段间直接转移

转移的目标地址由指令直接给出

格式

JMP FAR LABEL

在这里插入图片描述

段间间接转移

转移的目标地址由指令中的32位存储器操作数给出

格式

JMP OPRD

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

有条件转移指令

在满足一定条件下,程序转移到目标地址继续执行。

在条件转移指令之前,应有一条为条件转移指令的执行形成条件的指令(如对标志位产生影响的指令)

条件转移指令均为段内短转移,即转移范围为:

  • -128------+127字节

条件满足则转移,否则顺序执行

条件转移指令的应用

JC/JNC

判断CF的状态。常用于比大小。

JZ/JNZ

判断ZF的状态。常用于循环体的结束判断。

JO/JNO

判断OF的状态。常用于有符号数溢出的判断。

JP/JPE

判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数。

JA/JAE/JB/JBE

判断CF或CF+ZF的状态。常用于无符号数的大小比较。

其他条件转移指令

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述

数据比较程序详解

启动TD(Turbo Debugger)输入程序段,观察执行情况、标志位变化并分析
结果。

关于TD的使用,请参考下面这篇文章:

当条件转移指令的条件不成立时

此时的程序应该是顺序执行的

		 MOV AX, 2C16H 
         MOV BX, 0F180H
         CMP AX, BX
         JAE   ABOVE   ;注意ABOVE由具体地址替代,下同。
         XCHG AX,BX
   ABOVE:HLT 

MOV AX, 2C16H

该指令把2c16这个16进制数送入ax:
在这里插入图片描述

MOV BX, 0F180H

该指令将f180这个16进制数送入bx:
在这里插入图片描述

CMP AX, BX

CMP是比较指令,若AX的值大于等于BX,则CF等于0,否则CF等于1

在这里插入图片描述
很明显,在这个例子中,AX内的值小于BX内的值,所以CF被置1

注意看,此时IP的值是0108

JAE ABOVE

JAE是条件转移指令,当CF等于0时,IP的值变为ABOVE的值

由上一条命令的结果可知,现在CF的值为1,所以条件不成立,不会转移,当前指令执行后,IP会指向下一条指令,即IP的值会变为010A(若条件成立,IP的值会变为010B)

在这里插入图片描述
如图所示,结果验证正确。

XCHG AX,BX

XCHG是交换指令,它能将两个操作数存储的内容交换
在这里插入图片描述

  • 该指令执行前,AX的值为2C16H,BX的值为F180H

  • 指令执行后,AX的值为F180H,BX的值为2C16H

如图所示:
在这里插入图片描述

ABOVE:HLT

HLT是暂停指令,此时程序将中止

当条件转移指令的条件成立时

此时的程序会跳过倒数第二行指令

		 MOV AX, 0FF66H 
         MOV BX, 2020H
         CMP AX, BX
         JAE   ABOVE   ;注意ABOVE由具体地址替代,下同。
         XCHG AX,BX
   ABOVE:HLT 

在这里插入图片描述

MOV AX, FF66H

在这里插入图片描述

MOV BX, 2020H

在这里插入图片描述

CMP AX, BX

CMP是比较指令,若AX的值大于等于BX,则CF等于0,否则CF等于1

这里AX里的值比BX大,所以CF保持为0:
在这里插入图片描述

JAE ABOVE

JAE是条件转移指令,当CF等于0时,IP的值变为ABOVE的值

由上一条命令的结果可知,现在CF的值为0,所以条件成立,当前指令执行后,IP会指向ABOVE这个值的偏移地址,即IP的值会变为010C(若条件不成立,IP的值会变为010B)

在这里插入图片描述

XCHG AX,BX

该指令没有被执行

ABOVE:HLT

执行到该指令后,程序中断

排序程序

在这里插入图片描述

10个双字节(字)无符号数从小到大排序程序

DSEG   SEGMENT
BUFFER DW 0AAFEH,3768H,5CD9H,2227H,0BDC1H,725AH,0C236H
       DW 66FFH,0E23H,8577H
DSEG   ENDS

CSEG   SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
       MOV DS,AX
       LEA DI, BUFFER
       MOV BL,9 
NEXT1: MOV SI,DI 
       MOV CL,BL
NEXT2: MOV AX,[SI]
       INC SI
       INC SI
       CMP AX,[SI]
       JC NEXT3   ;小于则不交换 
       MOV DX,[SI] 
       MOV [SI-2],DX
       MOV [SI],AX
NEXT3: DEC CL 
       JNZ NEXT2
       DEC BL 
       JNZ NEXT1
       MOV AH,4CH
       INT 21H
CSEG   ENDS
       END START

在这里插入图片描述

对带符号数从小到大排列(只将无符号数从小到大排序程序中的“JC NEXT3”改为“JL NEXT3”即可)

10个双字节(字)有符号数从小到大排序程序

DSEG   SEGMENT
BUFFER DW 0AAFEH,3768H,5CD9H,2227H,0BDC1H,725AH,0C236H
       DW 66FFH,0E23H,8577H
DSEG   ENDS

CSEG   SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
       MOV DS,AX
       LEA DI, BUFFER
       MOV BL,9 
NEXT1: MOV SI,DI 
       MOV CL,BL
NEXT2: MOV AX,[SI]
       INC SI
       INC SI
       CMP AX,[SI]
       JL NEXT3   ;小于则不交换 
       MOV DX,[SI] 
       MOV [SI-2],DX
       MOV [SI],AX
NEXT3: DEC CL 
       JNZ NEXT2
       DEC BL 
       JNZ NEXT1
       MOV AH,4CH
       INT 21H
CSEG   ENDS
       END START

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页