两个数相加的汇编语言程序
发布网友
发布时间:2022-12-16 16:22
我来回答
共1个回答
热心网友
时间:2024-12-12 13:36
DATAS SEGMENT
STR1 DB 'Please input the first number(10-99) a:$'
STR2 DB 'Please input the second number(10-99) b:$'
STR3 DB 'The anwser a+b=$'
STR4 DB 'a=$'
STR5 DB 'b=$'
D1 DB 10
DB ?
D11 DB 10 DUP(?)
D2 DB 10
DB ?
D22 DB 10 DUP(?)
N1 DW ?
N2 DW ?
DATAS ENDS
STACKS SEGMENT
STA DB 100 DUP(?)
TOP EQU LENGTH STA
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV DX,OFFSET STR1 ;输入第一个个数
MOV AH,9
INT 21H
MOV DX,OFFSET D1
MOV AH,0AH
INT 21H
MOV DL,0DH ;回车换行
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV DX,OFFSET STR2 ;输入第二个数
MOV AH,9
INT 21H
MOV DX,OFFSET D2
MOV AH,0AH
INT 21H
MOV DX,0DH
MOV AH,2
INT 21H
MOV DX,0AH
MOV AH,2
INT 21H
MOV DX,OFFSET STR4
MOV AH,9
INT 21H
LEA SI,D1 ;第一个数放在D1
LEA DI,D11
CALL SLZSJZ ;调用子程序,将字符串D1转换为真正的两位数
MOV N1,AX
MOV DX,0DH
MOV AH,2
INT 21H
MOV DX,0AH
MOV AH,2
INT 21H
MOV DX,OFFSET STR5
MOV AH,9
INT 21H
LEA SI,D2 ;第二个数放在D2
LEA DI,D22
CALL SLZSJZ ;调用子程序,将字符串D2转换为真正的两位数
MOV N2,AX
MOV DX,0DH
MOV AH,2
INT 21H
MOV DX,0AH
MOV AH,2
INT 21H
MOV DX,OFFSET STR3
MOV AH,9
INT 21H
CALL JGTZ
XOR DX,DX
XOR CH,CH
XOR AH,AH
XOR BH,BH ;输出结果,先输出百位,如为0,则不输出;在输出十位和个位
CMP CL,30H
JZ DEW
PUSH AX
MOV DL,CL
MOV AH,2
INT 21H
POP AX
DEW:MOV DL,AL
MOV AH,2
INT 21H
XOR DX,DX
MOV DL,BL
MOV AH,2
INT 21H
JMP EXIT
JGTZ PROC
MOV BX,N1
MOV DX,N2
XOR CX,CX
ADD DX,BX
MOV AX,DX
XOR DX,DX
MOV DL,100
DIV DL
ADD AL,30H
MOV CL,AL ;结果的第一位放在CL
MOV AL,AH
XOR AH,AH
MOV DL,10
DIV DL
ADD AL,30H ;结果的第二位放在AL
MOV BL,AH
ADD BL,30H ;结果的第三位放在BL
XOR AH,AH
RET
JGTZ ENDP
SLZSJZ PROC
MOV [SI+4],'$'
MOV DX,DI ;输出输入的两位数
MOV AH,9
INT 21H
XOR CX,CX ;将输入的字符串每位的ASCII码转为真正的数字
MOV CX,2
SUB [SI+2],30H
SUB [SI+3],30H
XOR AX,AX ;计算出输入的两位数
XOR BX,BX
MOV AL,10
MOV BL,[SI+2]
MUL BL
ADD AL,[SI+3]
RET
SLZSJZ ENDP
EXIT:MOV AH,4CH
INT 21H
CODES ENDS
END START来自:求助得到的回答