汇编实验4

本实验使用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

感谢大家的观看

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值