.DATA
PROMPT1 DB 'Enter first hex digit (0-9, A-F): ', '$'
PROMPT2 DB 'Enter second hex digit (0-9, A-F): ', '$'
CHAR_PROMPT DB 'Enter operation character (A-D): ', '$'
RESULT_MSG DB 'Result: ', '$'
INVALID_INPUT DB 'Invalid input!', 0Dh, 0Ah, '$'
.CODE
START:
; 显示提示并读取第一个数字X
MOV AH, 09H
LEA DX, PROMPT1
INT 21H
CALL READ_HEX
; 保存第一个数字
MOV BL, AL
; 显示提示并读取第二个数字Y
MOV AH, 09H
LEA DX, PROMPT2
INT 21H
CALL READ_HEX
; 保存第二个数字
MOV BH, AL
; 显示提示并读取操作字符
MOV AH, 09H
LEA DX, CHAR_PROMPT
INT 21H
CALL READ_CHAR
; 执行运算
CMP AL, 'A'
JE ADDITION
CMP AL, 'B'
JE SUBTRACTION
CMP AL, 'C'
JE MULTIPLICATION
CMP AL, 'D'
JE DIVISION
; 如输入无效,显示错误信息
MOV AH, 09H
LEA DX, INVALID_INPUT
INT 21H
JMP END_PROGRAM
ADDITION:
; 计算 X + Y
MOV AL, BL
ADD AL, BH
JMP DISPLAY_RESULT
SUBTRACTION:
; 计算 |X - Y|
MOV AL, BL
SUB AL, BH
JNB POSITIVE ; 如果结果为正,跳到POSITIVE
NEG AL ; 否则取负数
POSITIVE:
JMP DISPLAY_RESULT
MULTIPLICATION:
; 计算 X * Y
MOV AL, BL
MUL BH
JMP DISPLAY_RESULT
DIVISION:
; 计算 X / Y
MOV AL, BL
XOR AH, AH ; 清除AH,因为DIV使用AX
DIV BH
JMP DISPLAY_RESULT
DISPLAY_RESULT:
; 显示结果
MOV AH, 09H
LEA DX, RESULT_MSG
INT 21H
; 显示AL中的值
CALL DISPLAY_HEX
JMP END_PROGRAM
READ_HEX PROC
; 读取一个十六进制数字
MOV AH, 01H
INT 21H
SUB AL, 30H
CMP AL, 9
JBE HEX_OK
SUB AL, 7
HEX_OK:
RET
READ_HEX ENDP
READ_CHAR PROC
; 读取一个字符
MOV AH, 01H
INT 21H
RET
READ_CHAR ENDP
DISPLAY_HEX PROC
; 将AL中的十六进制数字显示
ADD AL, 30H
CMP AL, 39H
JBE DISPLAY_OK
ADD AL, 7
DISPLAY_OK:
MOV DL, AL
MOV AH, 02H
INT 21H
RET
DISPLAY_HEX ENDP
END_PROGRAM:
; 程序结束
MOV AH, 4CH
INT 21H