本实验使用vscode+插件编写汇编代码和调试(点击查看教程)
实验内容
设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用排序算法(可选择,需指明采用哪种)按照从小到大的顺序排序并将排好序的数据存在DATA2开始的单元(循环程序部分已完成)。然后在显示器输出排好序的数据,中间用’,’隔开。
输出数据使用子程序方式。
流程图
主程序流程图和子程序流程图
实验结果
数据段内容(10个字数据)
DSEG SEGMENT
DATA1 DW 8,68,43,11,-25,1,31,-1,99,57;数据单元
DATA2 DW 10 DUP(0);结果单元
DSEG ENDS
空白处右键选debug调试
可以看到内存中DATA1的10个字数据和DATA2的10个0(都是小端法存储)
输入g程序显示排序之后的数据,再次查看内存,可以看到DATA1中从小到大排序后的数据并将结果存在DATA2中(都是小端法存储)
源代码
循环部分已在实验3中实现,这里直接使用
DSEG SEGMENT
DATA1 DW 8,68,43,11,-25,1,31,-1,99,57;数据单元
DATA2 DW 10 DUP(0);结果单元
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
BEGIN:
MOV AX,DSEG
MOV DS,AX;将DSEG赋值为数据段
MOV ES,AX;将DSEG赋值为附加段
MOV CX,9;冒泡排序外层循环次数
OUTFOR:
MOV BX,0;内层循环变量初值为0
LEA SI,DATA1;取DATA1首地址
INFOR:
MOV AX,[SI];将SI所指元素赋值给AX
CMP AX,[SI+2];比较AX和下一个值的大小
JLE LEN;AX小于等于下一个值跳转
MOV DX,[SI+2];AX大于下一个值,则两个值交换
MOV [SI],DX
MOV [SI+2],AX
LEN:ADD SI,2;SI加2,指向下一个值
INC BX
CMP BX,CX;比较BX和CX,判断内层循环是否结束
JB INFOR;小于则跳转,继续比较,直至内层循环结束
LOOP OUTFOR;CX-1,CX不等于0跳转继续外循环,等于0则冒泡排序结束,保存结果
MOV CX,10;将排序后的结果传送到DATA2单元
LEA SI,DATA1
LEA DI,DATA2
CLD;DF标志位清零
REP MOVSW;重复执行
CALL FUNC;调用子程序显示结果
MOV AX,4C00H;结束
INT 21H
FUNC PROC;子程序说明过程开始
LEA SI,DATA2;取结果单元首地址
MOV CX,10;设置循环次数
HHH:MOV BX,[SI];将SI所指地址的元素赋值给BX
CMP BX,0;判断BX是否为负,是则跳转
JL FU
NOTS:
CMP BX,10;判断BX是否大于等于10,是则跳转
JGE TENS
NOS:MOV AH,2
MOV DL,BL;将个位数赋值给DL
ADD DL,30H;将要显示数的ASCII码赋值给DL
INT 21H
ADD SI,2;SI指针加2,指向下一个值
CMP CX,1;判断CX是否小于等于1,是则跳转,即判断是否还剩一个值
JLE NNN;最后一个值显示后不再显示','
MOV AH,2
MOV DL,',';显示','隔开
INT 21H
LOOP HHH;CX-1,CX不为0时,跳转,为0时执行下一步
NNN:RET;返回
FU: NEG BX;BX取反
MOV AH,2
MOV DL,'-';显示负号
INT 21H
JMP NOTS;跳转,显示取反后的数
TENS:
MOV AX,BX;将BX赋值给AX
MOV DL,10
DIV DL ;AX除以10,AL是商,AH是余数
MOV BL,AH;将余数赋值给BL
MOV AH,2
MOV DL,AL;将商赋值给DL,显示十位的数字
ADD DL,30H;将要显示数的ASCII码赋值给DL
INT 21H
JMP NOS;跳转,显示个位数字
FUNC ENDP;子程序说明过程结束
CSEG ENDS;代码段结束
END BEGIN
感谢大家的观看