求助:帮我改个加法程序
CRLF MACRO ;定义回车换行的宏命令 宏指令名crlfMOV DL,0DH
MOV AH,02H
INT 21H ;int 21h 执行功能调用
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT ;定义数据段 segment定义段,段名为segment
DATA1 DB 20 DUP(?) ;加数
DATA2 DB 20 DUP(?) ;被加数
DATA ENDS
STACK SEGMENT ;堆栈段
STA DB 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT ;程序段
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA ;assume规定段所属的段寄存器
START: MOV AX,DATA ;数据段地址DS
MOV DS,AX
MOV AX,STACK ;确定堆栈
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV BX,02
MOV SI,OFFSET DATA1 ;设置指针
CALL INPUT ;调用输入函数INPUT
CRLF
MOV BX,02 ;调用输入函数
MOV SI,OFFSET DATA2
CALL INPUT
CRLF
CRLF
MOV SI,OFFSET DATA2 ;显示被加数
MOV BX,02 ;2位
CALL DISPL
CRLF
MOV SI,OFFSET DATA1 ;取加数地址,显示加数
MOV BX,02
CALL DISPL
CRLF
MOV DI,OFFSET DATA2 ;取被加数首址
CALL ADDA ;执行加法
MOV SI,OFFSET DATA1 ;显示结果
MOV BX,02
CALL DISPL
CRLF
MOV AX,4C00H ;程序结束 返回DOS
INT 21H
DISPL PROC NEAR ;proc指示过程开始,过程名proc near定义近指针
DSI: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H ;这三句为显示输出,被输出的字符送DL
DEC BX
JNZ DSI
RET ;返回DOS,不过是有条件的,
DISPL ENDP
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,02
AD1: SUB BYTE PTR[SI+BX-1],30H ;byte指示字节长度的操作数 byte ptr
SUB BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,02
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
INC SI
INC DI ;inc加,dec减
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,02
AD3: ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNE AD3
RET
INPUT PROC NEAR ;函数的输入
IN1:MOV AH,01
INT 21H ;这两句,从键盘输入数,并回显 字符到AL,AL中为ASCII码
MOV [SI],AL
INC SI
DEC BX
JNZ IN1 ;in1为0时循环结束
RET
INPUT ENDP
ADDA ENDP
CODE ENDS
END START
这个程序我想是输入12+12等于24的,是我输出的是21+21=42 有谁能帮我看一下哪里出了吗?
[ 本帖最后由 chchb 于 2012-10-30 22:21 编辑 ]