题目:从键盘读入两个一位十六进制数,根据条件,以十六进制输出计算结果
A:计算X+Y B:计算|X-Y| C:计算X*Y D:计算X/Y
源程序:
DATA SEGMENT
X DB ?
Y DB ?
Z DB 2 DUP(0), '$'
LIST DB '0123456789ABCDEF', '$' ; 检测输入是否为有效数字的存储列表
STR1 DB 'INPUT X: $'
STR2 DB 0AH, 0DH, 'INPUT Y: $'
STR3 DB 0AH, 0DH, 'CHOOSE [A], [B], [C] OR [D]: $'
STR4 DB 0AH, 0DH, 'ERROR! YOUR INPUT IS INVALID!$'
STR5 DB 0AH, 0DH, 'THE RESULT IS: $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
BEGIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET STR1 ; 提示信息
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
MOV DI, OFFSET LIST ; 取出LIST的偏移量
MOV BL, 46H ; 令BL为46H(字符F的ASCII码值)
LOP1: CMP AL, [DI] ; 将读入的字符与存储列表逐个比较
JE NEXT1 ; 若有效,则跳转
CMP [DI], BL ; 已经比较至F(列表尾部),即输入的是无效字符
JE ERROR1 ; 跳转至错误信息
INC DI ; DI加1,指向列表中下一个字符
LOOP LOP1 ; 新一轮循环
ERROR1: MOV DX, OFFSET STR4 ; 错误信息
MOV AH, 09H
INT 21H
JMP OVER
NEXT1: CMP AL, 39H ; 比较输入的字符是否为0~9
JA NEXT2 ; 若为A~F则跳转
AND AL, 0FH ; 否则屏蔽高4位(将ASCII码还原成数字)
MOV X, AL
JMP NEXT3 ; 跳转
NEXT2: SUB AL, 07H ; 输入为A~F,则将读入的ASCII码减去7
AND AL, 0FH ; 屏蔽高4位(将对应的ASCII码还原成字母)
MOV X, AL ; X值获取结束,存入变量
NEXT3: MOV DX, OFFSET STR2 ; 以下为获取Y的值,与上面获取X的步骤相同
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
MOV DI, OFFSET LIST
MOV BL, 46H
LOP2: CMP AL, [DI]
JE NEXT4
CMP [DI], BL
JE ERROR2
INC DI
LOOP LOP2
ERROR2: MOV DX, OFFSET STR4
MOV AH, 09H
INT 21H
JMP OVER
NEXT4: CMP AL, 39H
JA NEXT5
AND AL, 0FH
MOV Y, AL
JMP NEXT6
NEXT5: SUB AL, 07H
AND AL, 0FH
MOV Y, AL ; Y值获取结束,存入变量
NEXT6: MOV DX, OFFSET STR3 ; 提示信息
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 41H ; 若输入为41H(字符A的ASCII码值)
JE CASE1 ; 则跳转
CMP AL, 42H ; 若输入为42H(字符B的ASCII码值)
JE CASE2 ; 则跳转
CMP AL, 43H ; 若输入为43H(字符C的ASCII码值)
JE CASE3 ; 则跳转
CMP AL, 44H ; 若输入为44H(字符D的ASCII码值)
JE CASE4 ; 则跳转
ERROR3: MOV DX, OFFSET STR4 ; 否则,显示错误信息
MOV AH, 09H
INT 21H
JMP OVER
CASE1: MOV AL, X ; 二者相加
ADD AL, Y
JMP CAL ; 跳至CAL处进行处理
CASE2: MOV AL, X ; 二者相减的绝对值
CMP AL, Y ; 比较X,Y的大小
JB CASE2_A ; 若X < Y,则跳转
SUB AL, Y ; 否则用X减Y
JMP CAL ; 跳至处理部分
CASE2_A: MOV X, AL ; 此时X < Y
MOV AL, Y
SUB AL, X ; 用Y减X
JMP CAL ; 跳转
CASE3: MOV AL, X ; 二者相乘
MOV BL, Y
MUL BL
JMP CAL ; 跳转
CASE4: AND AH, 00H ; 首先屏蔽AH部分,避免干扰
MOV AL, X
MOV BL, Y
DIV BL ; X除以Y,商在AL中,余数在AH中
JMP SPECIAL ; 由于其特殊性,不能直接跳至CAL处
CAL: MOV AH, AL ; 令高8位等于低8位
AND AH, 0F0H ; 屏蔽AH的低四位(保留十位数字)
MOV CL, 4 ; CL为右移位数
SHR AH, CL ; 逻辑右移4位,使得AH的低四位变为高四位,高四位置0
AND AL, 0FH ; 屏蔽AL低四位(保留个位数字)
SPECIAL: CMP AL, 0AH ; 判断AL与0AH的关系
JB CASEA ; 如果AL < 0AH,则跳转到CASE_1A
ADD AL, 07H ; 否则将AL加上07H(转到字母所对应的ASCII码)
CASEA: MOV DI, OFFSET Z ; 把Y的偏移量赋给DI
ADD DI, 1 ; DI加1,指向Y的高地址部分(Y有两个字节)
ADD AL, 30H ; 将AL加30H使数字对应上相应的ASCII码
MOV [DI], AL ; 把AL的值赋给DI所指向的地址
DEC DI ; DI减1(向低地址移动1个字节)
CMP AH, 0AH ; 判断AH与0AH的关系
JB CASEB ; 如果AH < 0AH,则跳转到CASE_1B
ADD AH, 07H ; 否则将AH加上07H(转到字母所对应的ASCII码)
CASEB: ADD AH, 30H ; 将AH加30H使数字对应上相应的ASCII码
MOV [DI], AH ; 把AH的值赋给DI当前所指向的地址
SHOW: MOV DX, OFFSET STR5 ; 显示提示信息和结果
MOV AH, 09H
INT 21H
MOV DX, OFFSET Z
MOV AH, 09H
INT 21H
MOV DL, 'H'
MOV AH, 02H
INT 21H
OVER: MOV AH, 4CH ; 中止
INT 21H
CODE ENDS
END BEGIN