问题描述
在 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