概述
多字节有(无)符号数排序程序
- 前言
- 基础知识
- 六大标志位
- 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
实现思路
程序详解
查看待排序数组的初始状态:
配置外循环:
取到第一个值:
SI可以理解为指针,即取到下一个数,然后用CMP指令比较两个数的大小:
AAFEH和3768H比,明显前者大,即AX≥BX,所以CF=0
因为前者大,所以两者做交换,注意看交换过程:
- 首先把后一个数,即较小的那个数用DX保存起来
- 把DX里存的数据往前放(因为是从小到大排序)
- 把比较时较大的那个数复原,即放到第二个位置上
如此一来,便完成了交换的操作
接着,外循环次数减1:
循环未结束,程序跳转至NEXT2继续执行:
然后继续取数,如此往复循环,直至排序结束,这里我录了一个视频便于大家理解:
多字节无符号数排序程序(执行过程)
有符号数从小到大排序
编写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
效果展示
排序前:
排序后:
如果这样看别扭的话,可以转换成双字节形式查看:
最后
以上就是曾经小兔子为你收集整理的汇编语言程序设计之多字节有(无)符号数排序程序前言基础知识无符号数从小到大排序有符号数从小到大排序无符号数从大到小排序的全部内容,希望文章能够帮你解决汇编语言程序设计之多字节有(无)符号数排序程序前言基础知识无符号数从小到大排序有符号数从小到大排序无符号数从大到小排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复