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

问题描述

在 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

你可能感兴趣的:(汇编)