求高手 一道大一的题目!!!


从键盘中键入两个4位数,分别保存到BUF1和BUF2存储区中,进行求和,求和的结果送至变量SUM当中,并进行显示  用“汇编语言”的!!
 比如输入1234 
                5678
得出结果是6912
 比如输入9999
               1111
 得出结果是11110
                      这里要注意有进位和无进位 

14 个解决方案

#1



 4位数AX够用吧? 往哪进位?

#2


; 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 ;回车
     
    MOV AH,01H
    INT 21H
    MOV OP,AX
    INT 21H
    AND OP,0FFH
    
    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
   

    
    ;输出A
    PUSH SIGNA
    PUSH NA 
    LEA SI,A
    PUSH SI
    CALL OUTARRAY 
    ;输出运算符
    MOV AX,OP
    CALL PUTCHAR
       
    ;输出B
    PUSH SIGNB
    PUSH NB     
    LEA SI,B
    PUSH SI
    CALL OUTARRAY 
    ;输出等号
    MOV AL,'='
    CALL PUTCHAR  
    
    ;输出结果
    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 SUBARRAY 
  
  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 


SUBARRAY PROC 
    MOV BP,SP
    MOV BX,[BP+6]
    MOV DI,[BP+4]
    MOV SI,[BP+2]            
    MOV CX,MAXV
    XOR AH,AH    
SUBL:
    MOV AL,[SI] 
    SUB AL,AH
    MOV AH,0
    CMP AL,[DI]
    JGE GREAT
    ADD AL,10
    MOV AH,1
GREAT:SUB AL,[DI]
    MOV [BX],AL       
    INC SI
    INC DI
    INC BX
LOOP SUBL 

    LEA SI,BINT
    MOV CX,MAXV
    ADD SI,CX
FNZERO:DEC SI
    CMP [SI],0
    JNZ NZEND
    LOOP FNZERO
NZEND:
    MOV NC,CX
    CMP CX,0
    JG ENDSUB
    MOV NC,1   
ENDSUB:
    RET 6  
SUBARRAY ENDP    
 code ends    
    
end start ; set entry point and stop the assembler.

输完数后回车,手动输入加减号
如:
211(回车)
+(回车)
111(回车)
显示:211 +111 = 322 

#3


理论上,支持99位加减法

#4


#5


 我觉得 LZ看完头会晕

#6


引用 5 楼 znxllyuan 的回复:
 我觉得 LZ看完头会晕

这个......

#7


吓死我了  有这么难麽??? 
  只要输入 2个四位数 回车他答案就会自动跳出的那种~~

#8


输入一个4位数后 按回车
在输入下一个4位数 按回车
得出结果

 结果显示出 有进位是指9999+1111的话结果会是5位数 这个意思

#9


不是很清楚

#10


; 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.

简化版,满足需求

#11


 。。。 简化。。。。 我。。。

#12


该回复于2010-12-20 16:50:41被版主删除

#13


学习啊,高人啊

#14


我写了一个加法的,可是如果各位超过10了就不好用了,比如我输入1234+2345,输出的结果是3579,可是如果是1234+5688,输出的却是68AB,不知道为什么,有哪位能回答我一下
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告