0
点赞
收藏
分享

微信扫一扫

汇编语言程序设计之多字节有(无)符号数排序程序


多字节有(无)符号数排序程序

  • ​​前言​​
  • ​​基础知识​​
  • ​​六大标志位​​
  • ​​CF——进位标志位​​
  • ​​PF——奇偶标志位​​
  • ​​AF——辅助进位标志位​​
  • ​​ZF——零标志位​​
  • ​​SF——符号标志位​​
  • ​​OF——溢出标志位​​
  • ​​CMP——比较指令​​
  • ​​两个无符号数比较​​
  • ​​两个有符号数比较​​
  • ​​条件转移指令​​
  • ​​JC​​
  • ​​JL​​
  • ​​JNE​​
  • ​​无符号数从小到大排序​​
  • ​​参考代码​​
  • ​​实现思路​​
  • ​​程序详解​​
  • ​​有符号数从小到大排序​​
  • ​​参考代码​​
  • ​​无符号数从大到小排序​​
  • ​​实现思路——改变条件转移指令​​
  • ​​参考代码​​
  • ​​效果展示​​

前言

排序算法是必须要掌握的算法,无论是日常使用、竞赛还是面试,都能用上,目前也有很多排序算法,比如快速排序、冒泡排序等。

因此,尝试使用不同的编程语言实现一些排序算法还是很有必要,这也有助于培养编程思想

基础知识

  • ​​MOV指令的使用详解​​

六大标志位

在本程序中,使用条件判断指令时,当条件满足时会使状态标志位发生改变

因此我们需要牢牢记住以下六个状态标志位发生改变的条件

CF——进位标志位

当进行加(减)法运算时,若最高位向前有进(借)位,则CF=1,否则CF=0

PF——奇偶标志位

当运算结果的低8位中1的个数为偶数时PF=1,为奇数时PF=0

AF——辅助进位标志位

在加(减)法操作中,D3向D4有进位(借位)时,AF=1,否则AF=0

DAA指令和DAS指令测试这个标志位,以便在BCD加法或减法之后调整AL中的值

ZF——零标志位

当运算结果为零时,ZF=1,否则ZF=0

SF——符号标志位

当运算结果的最高位为1时SF=1,否则SF=0

OF——溢出标志位

当算数运算的结果超出了带符号数的范围,即溢出时OF=1,否则OF=0

CMP——比较指令

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

格式:

CMP OPRD1,OPRD2

操作:

OPRD1- OPRD2

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

两个无符号数比较

CMP AX,BX

  • 若AX≥BX 则CF=0
  • 若AX<BX 则CF=1

两个有符号数比较

CMP AX,BX

  • 若AX≥BX 则OF=SF
  • 若AX≤BX 则OF≠SF

条件转移指令

汇编语言程序设计之多字节有(无)符号数排序程序_排序

JC

使用CMP比较指令对无符号数比较时,若AX<BX,则CF=1,此时条件成立,程序跳转

JL

使用CMP比较指令对有符号数比较时,若AX≤BX,则OF≠SF,此时条件成立,程序跳转

如果要简单记忆,可以这样记:

  • 无论什么数,用CMP指令比较,左边小就跳转,无符号数用JC,有符号数用JL

JNE

JNE指令常用来判断循环是否结束,如果ZF=0即没有遍历完,则继续跳转至主程序中

无符号数从小到大排序

编写10个双字节(字)无符号数从小到大排序程序,观察执行情况并分
析结果:利用MASM宏汇编程序及TD程序进行调试。

参考代码

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

实现思路

汇编语言程序设计之多字节有(无)符号数排序程序_汇编_02

程序详解

汇编语言程序设计之多字节有(无)符号数排序程序_微机_03


查看待排序数组的初始状态:

汇编语言程序设计之多字节有(无)符号数排序程序_微机_04


配置外循环:

汇编语言程序设计之多字节有(无)符号数排序程序_MASM_05

取到第一个值:

汇编语言程序设计之多字节有(无)符号数排序程序_MASM_06


SI可以理解为指针,即取到下一个数,然后用CMP指令比较两个数的大小:

汇编语言程序设计之多字节有(无)符号数排序程序_微机_07


AAFEH和3768H比,明显前者大,即AX≥BX,所以CF=0

因为前者大,所以两者做交换,注意看交换过程:

  1. 首先把后一个数,即较小的那个数用DX保存起来
  2. 把DX里存的数据往前放(因为是从小到大排序)
  3. 把比较时较大的那个数复原,即放到第二个位置上

如此一来,便完成了交换的操作

接着,外循环次数减1:

汇编语言程序设计之多字节有(无)符号数排序程序_算法_08


循环未结束,程序跳转至NEXT2继续执行:

汇编语言程序设计之多字节有(无)符号数排序程序_排序_09


然后继续取数,如此往复循环,直至排序结束,这里我录了一个视频便于大家理解:

多字节无符号数排序程序(执行过程)

有符号数从小到大排序

编写10个双字节(字)有符号数从小到大排序程序,观察执行情况并分
析结果:利用MASM宏汇编程序及TD程序进行调试。

参考代码

带符号数从小到大排列程序来说,只需要将无符号数从小到大排序程序中的“JC NEXT3”改为“JL NEXT3”即可

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

无符号数从大到小排序

这里做一个小小的拓展,原来是从小到大排序,现在改成从大到小排序

编写10个双字节(字)无符号数从大到小排序程序,观察执行情况并分
析结果:利用MASM宏汇编程序及TD程序进行调试。

实现思路——改变条件转移指令

在无符号数从小到大排序程序的基础上进行修改的思路:

原程序使用JC指令时,前者比后者大则交换(因为要从小到大排序),而题目改动后前者比后者大时应该不交换(从大到小排序),所以只需要把JC指令换成JNC即可

参考代码

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]
JNC 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

效果展示

排序前:

汇编语言程序设计之多字节有(无)符号数排序程序_微机_10


排序后:

汇编语言程序设计之多字节有(无)符号数排序程序_微机_11


如果这样看别扭的话,可以转换成双字节形式查看:

汇编语言程序设计之多字节有(无)符号数排序程序_微机_12


举报

相关推荐

0 条评论