求高手 一道大一的题目!!!
从键盘中键入两个4位数,分别保存到BUF1和BUF2存储区中,进行求和,求和的结果送至变量SUM当中,并进行显示 用“汇编语言”的!!
比如输入1234
5678
得出结果是6912
比如输入9999
1111
得出结果是11110
这里要注意有进位和无进位
[解决办法]
; multi-segment executable file template.
data segment
; add your data here!
;ARRAY DB 'ABCDEF'
MAXN EQU 100
A DB 100 DUP(0)
NA DW 0
SIGNA DW '+'
B DB 100 DUP(0)
NB DW 0
SIGNB DW '+'
bint DB 101 DUP(0)
NC DW 0
SIGNC DW '+'
OP DW '+'
MAXV DW 0
help db 'Do you want to continue? (y/n):$'
pkey db "press any key...$"
data ends
stack segment
dw 128 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;输入A
RESTART:
MOV SI,OFFSET SIGNA
PUSH SI
MOV SI,OFFSET NA
PUSH SI
LEA SI,A
PUSH SI
CALL CINBINT
PUSH NA
LEA SI,A
PUSH SI
CALL REVERSE
;输入运算符
CALL CRLF ;回车
;输入B
MOV SI,OFFSET SIGNB
PUSH SI
MOV SI,OFFSET NB
PUSH SI
LEA SI,B
PUSH SI
CALL CINBINT
PUSH NB
LEA SI,B
PUSH SI
CALL REVERSE
CALL CRLF ;回车
;A,B的位数
MOV AX,NA
CMP AX,NB
JGE COMP1
MOV AX,NB
COMP1:
MOV MAXV,AX
;计算大整数相加
CALL CALBINT
;输出结果
PUSH SIGNC
PUSH NC
LEA SI,bint
PUSH SI
CALL OUTARRAY
CALL CRLF ;回车
LEA DX,HELP
MOV AH,9
INT 21H
MOV AH,01H
INT 21H
MOV BL,AL
INT 21H
CALL CRLF ;回车
MOV AL,BL
OR AL,020H
CMP AL,'y'
JNE ENDSTART
MOV BP,OFFSET RESTART
JMP BP
;JMP RESTART
ENDSTART:
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
CINBINT PROC
MOV BP,SP
MOV BX,[BP+6]
MOV SI,[BP+2]
MOV [BX],'+'
;将数组高位清零
MOV CX,MAXN
CLEARL:MOV [SI],0
INC SI
LOOP CLEARL
MOV SI,[BP+2]
;输入整数的正负号
MOV AH,01H
INT 21H
CMP AL,'+'
JNE NEGATIVE
MOV [BX],AX
JMP CIN
NEGATIVE: CMP AL,'-'
JNE NUMBER
MOV [BX],AX
JMP CIN
NUMBER:AND AL,0FH
MOV [SI],AL
INC SI
CIN:INT 21H
CMP AL,0DH
JE ENDCIN
AND AL,0FH
MOV [SI],AL
INC SI
JMP CIN
ENDCIN:MOV AX,SI
MOV SI,[BP+2]
SUB AX,SI
MOV SI,[BP+4]
MOV [SI],AX
;将符号的高位清零
AND WORD PTR [BX],0FFH
RET 6
CINBINT ENDP
PUTCHAR PROC
PUSH DX
PUSH AX
MOV AH,02H
MOV DL,AL
INT 21H
POP AX
POP DX
RET
PUTCHAR ENDP
CRLF PROC
PUSH AX
PUSH DX
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
CRLF ENDP
OUTARRAY PROC
MOV BP,SP
MOV DX,[BP+6]
MOV CX,[BP+4]
MOV SI,[BP+2]
ADD SI,CX
MOV AH,02H
CMP DL,'-'
JNE L1
INT 21H
L1:DEC SI
MOV DL,[SI]
OR DL,30H
INT 21H
LOOP L1
RET 6
OUTARRAY ENDP
ADDARRAY PROC
LEA BX,bint
LEA DI,B
LEA SI,A
MOV CX,MAXV
MOV DL,0
L3: MOV AL,[SI]
INC SI
ADD AL,[DI]
INC DI
ADD AL,DL
MOV DL,0
CMP AL,10
JL L2
MOV DL,1
SUB AL,10
L2:MOV [BX],AL
INC BX
LOOP L3
MOV [BX],DL
MOV AL,DL
XOR AH,AH
ADD AX,MAXV
MOV NC,AX
RET
ADDARRAY ENDP
REVERSE PROC
MOV BP,SP
MOV CX,[BP+4]
MOV SI,[BP+2]
MOV BX,CX
LEA DI,[SI+BX-1]
INC CX;防止数组长度为1时,无限循环
SHR CX,1
LR:MOV AL,[SI]
XCHG AL,[DI]
MOV [SI],AL
INC SI
DEC DI
LOOP LR
RET 4
REVERSE ENDP
CMPARRAY PROC
MOV CX,NA
CMP CX,NB
JE COMPL
JG GREATER
JL LESS
COMPL:MOV BX,CX
LEA SI,A[BX]
LEA DI,B[BX]
CLP:
DEC SI
DEC DI
MOV AL,[SI]
CMP AL,[DI]
LOOPZ CLP
JG GREATER
JE EQUAL
JL LESS
GREATER:MOV AL,1
JMP ENDCMP
EQUAL: MOV AL,0
JMP ENDCMP
LESS: MOV AL,-1
JMP ENDCMP
ENDCMP: RET
CMPARRAY ENDP
calbint PROC
MOV SIGNC,'+'
MOV AX,SIGNA
XOR AX,SIGNB
XOR AX,OP
CMP AL,'+'
JNE SUBBINT
CALL ADDARRAY
MOV BX,SIGNA
MOV SIGNC,BX
JMP ENDCALBINT
SUBBINT:
CALL CMPARRAY
;mov dl,al
LEA SI,A
LEA DI,B
LEA BX,BINT
CMP AL,0
JE EQUALSUB
PUSH AX
JG ENDCMPL
XCHG SI,DI
ENDCMPL:
PUSH BX
PUSH DI
PUSH SI
CALL ADDARRAY
POP AX
CMP AL,0
JL NEGAT
CMP SIGNA,'-'
JNE ENDCALBINT
MOV SIGNC,'-'
JMP ENDCALBINT
NEGAT:CMP SIGNA,'+'
JNE ENDCALBINT
MOV SIGNC,'-'
JMP ENDCALBINT
EQUALSUB:MOV bint[0],0
MOV NC,1
MOV SIGNC,'+'
JMP ENDCALBINT
ENDCALBINT:RET
calbint ENDP
code ends
end start ; set entry point and stop the assembler.