汇编语言练习题
1、输入两个十进制的数,以十六进制输出两者的和,例如,输入3和4,输出07;输入6和7,输出0D;输入8和9,输出11
2、输入两个十六进制的数,以十进制输出两者的和。例如,输入3和5,输出08;输入6和7,输出13;输入9和A,输出19
;输入两个十进制的数,以十六进制输出两者的和,例如,输入3和4,输出07;输入6和7,输出0D;输入8和9,输出11
;输入两个十六进制的数,以十进制输出两者的和。例如,输入3和5,输出08;输入6和7,输出13;输入9和A,输出19
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA SEGMENT
NUM1 DB 0,0 ;存放第一种运算的两个加数
NUM2 DB 0,0 ;存放第二种运算的加数
SUM DW 0,0 ;存放两个运算的和
STR1 DB 'Please input two numbers (DEC) :',0AH,0DH,'$'
SUM1 DB 'The sum is (HEX) :',0AH,0DH,'$'
STR2 DB 'Please input two numbers (HEX) :',0AH,0DH,'$'
SUM2 DB 'The sum is (DEC) :',0AH,0DH,'$'
CRLF DB 0AH,0DH,'$'
DATA ENDS
STACK SEGMENT
DB 128 DUP(0)
STACK ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
;-------输出提示语句------
LEA DX,STR1
MOV AH,9
INT 21H
INPUT_DEC:
;-------输入两个十进制数-----
MOV AH,01H
INT 21H
MOV NUM1[0],AL
SUB NUM1[0],30H
MOV AH,01H
INT 21H
MOV NUM1[1],AL
SUB NUM1[1],30H
LEA DX,CRLF
MOV AH,9
INT 21H
SUM_DEC:
MOV BL,NUM1[0]
ADD BL,NUM1[1]
;SUB BX,30H
MOV SUM[0],BX ;将第一个计算结果的ASCII码存放在sum1
PRINTSUM_HEX:
;-------提示输出答案16进制
LEA DX,SUM1
MOV AH,9
INT 21H
MOV AX,SUM[0]
CMP AX,16
JG PRINT_DIGIT ;比9小,在0-9范围
CMP AX,10
JB PRINT_DIGIT ;在10-15范围内
JMP PRINT_CHAR ;比9大,比16小,输出字母
PRINT_DIGIT:
MOV BX,16 ;dx=10,除以10
MOV CX,0 ;cx记录位数,最后输出字符的个数,记录循环次数
MOV DX,0 ;dx记录余数
S1: ;将单个数字依次入栈
DIV BX ;ax=ax/16商,dx=ax/16余数
PUSH DX ;将余数dx入栈
INC CX ;位数加一
CWD ;将ax扩展到dx.ax
CMP AX,0 ;将剩下的数ax与0比较
JNE S1 ;若ax!=0,继续循环
S2: ;输出字符,cx为循环次数,一个数有多少位
POP DX ;栈顶的数据出栈,给dx
ADD DL,30H ;转化为字符
MOV AH,02H
INT 21H ;dl字符输出
LOOP S2 ;循环cx
JMP INPUT_HEX
PRINT_CHAR:
MOV DX,0
SUB AX,10
MOV DL,AL
ADD DL,65
MOV AH,02H
INT 21H
JMP INPUT_HEX
INPUT_HEX:
;------输出换行-----
LEA DX,CRLF
MOV AH,9
INT 21H
;------输出提示字符串-----
LEA DX,STR2
MOV AH,9
INT 21H
;-------输入加数-----
MOV AH,01H
INT 21H
MOV NUM2[0],AL
MOV AH,01H
INT 21H
MOV NUM2[1],AL
LEA DX,CRLF
MOV AH,9
INT 21H
LEA DX,SUM2
MOV AH,9
INT 21H
JUDGE PROC NEAR
MOV CX,2
MOV SI,0
MOV BX,0
SUM_HEX:
;-------比较判断是数字还是字母-----
MOV AL,NUM2[SI]
CMP AL,57 ;和9比较
JG TO_DEC ;是字母,变回数字
SUM_AGAIN:
SUB NUM2[SI],30H
AD: INC SI
LOOP SUM_HEX
JMP DEAL_SUM
TO_DEC:
SUB AL,65
ADD AL,48
;-------将字母对应的数字扩成对应十进制-----
SUB AL,38
SUB AL,32
MOV NUM2[SI],AL
JMP AD
RET
JUDGE ENDP
DEAL_SUM:
MOV BL,NUM2[0]
ADD BL,NUM2[1]
MOV SUM[2],BX
JMP PRINT_DIGIT2
PRINT_DIGIT2 PROC NEAR
MOV AX,BX ;AX存放着sum2
MOV BX,10 ;dx=10,除以10
MOV CX,0 ;cx记录位数,最后输出字符的个数,记录循环次数
MOV DX,0 ;dx记录余数
T1: ;将单个数字依次入栈
DIV BX ;ax=ax/10商,dx=ax/10余数
PUSH DX ;将余数dx入栈
INC CX ;位数加一
CWD ;将ax扩展到dx.ax
CMP AX,0 ;将剩下的数ax与0比较
JNE T1 ;若ax!=0,继续循环
T2: ;输出字符,cx为循环次数,一个数有多少位
POP DX ;栈顶的数据出栈,给dx
ADD DL,30H ;转化为字符
MOV AH,02H
INT 21H ;dl字符输出
LOOP T2 ;循环cx
JMP EXIT
RET
PRINT_DIGIT2 ENDP
EXIT:
MOV AX,4C00H
INT 21H
CODE ENDS
END START