汇编实验——判断三个无符号数最大数且在屏幕显示(带详细注释)

问题描述

在 BUF 和 BUF+1、BUF+2 单元分别放有一个无符号字节型数,编程序将其中最大数存入 MAX 单元,并在屏幕上显示。

STACK SEGMENT STACK;初始化堆栈段
	DB 1024 DUP(0)
STACK ENDS;堆栈段结束

DATA SEGMENT;定义数据段
	BUF DB 70H,35H,1FH;定义字节型buf变量并存入三个无符号数
	MAX DB 2 DUP(?),'$';定义max变量存放结果的两位asii码,并以$符结尾,方便以字符串形式输出
	MSG DB 'The largest of the three unsigned numbers is $'
DATA ENDS;数据段结束

CODE SEGMENT;定义代码段
	ASSUME CS:CODE,DS:DATA,SS:STACK;伪指令:指明定义当前段与段寄存器的关系

	BEGIN: MOV AX,DATA;进行代码段的装入
	MOV DS,AX

	MOV AL,BUF;将BUF第一字节装入AL
	CMP AL,BUF+1;AL与BUF变量第二字节比较
	JAE LP1;AL中存储的BUF变量第一字节大于等于第二字节的内容则跳入LP1标号

	MOV AL,BUF+1;否则执行该语句,将BUF+1装入AL,为当前最大值
	LP1:CMP AL,BUF+2;将AL中存储的当前最大值与第三字节的数字比较
	JAE LP2;若AL中存储的值仍然大则跳入LP2

	MOV AL,BUF+2;否则将第三字节装入AL,为最终的最大值

	LP2:MOV CX,02H;2装入CX作为循环次数
	;因为需要将8位二进制对应的数字转为asii码,这样的操作需要进行两次

	MOV DI, OFFSET MAX;将max变量的有效地址装入目的变址寄存器
	MOV DL, AL;将AL中存储的最终结果送入DL
	INC DI;DI加一,因为先处理低4位数据,转换后的asii码需要存入max变量的高字节地址

	LP3:AND AL, 0FH;AL与00001111进行按位逻辑与运算,将高四位全部置零,保留第四位处理
	CMP AL,0AH;AL中的第四位值与10比较
	JB LP4;若小于10则跳入lp4标号,进行转换为asii码操作
	ADD AL, 07H;若大于9则需要进行加7校正,方便统一转换asii码

	LP4:ADD AL, 30H;0的ASII码为30,A为41
	MOV [DI],AL;将转换后的ASII码存储到DI寄存器中存储的地址单元(第一次是max第二字节,第二次是第一字节)
	DEC DI;DI中存储的地址减一
	PUSH CX;保存CX中的当前值
	MOV CL,04;4装入CL作为移位次数
	SHR DL,CL;进行逻辑右移,将DL存储的低四位移出,高位补零
	POP CX;还原cx的值
	MOV AL,DL;将处理好的dl中的值送入al

	LOOP LP3;LOOP指令,(CX)-1=(CX) 若CX不等于0则跳入LP3
	;重新执行上述操作,将高位转为asii码存入MAX变量第一字节

	MOV DX,OFFSET MSG;输出提示信息
	MOV AH,09H
	INT 21H

	MOV DX,OFFSET MAX;将MAX有效地址装入DX
	MOV AH,09H;调用9号功能输出字符串
	INT 21H

	MOV DL,'H';输出十六进制数后缀
	MOV AH,02H
	INT 21H

	MOV AH,4CH;结束程序
	INT 21H
CODE ENDS
END BEGIN
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值