首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

求好手 一道大一的题目!

2013-07-01 
求高手 一道大一的题目!!!从键盘中键入两个4位数,分别保存到BUF1和BUF2存储区中,进行求和,求和的结果送至

求高手 一道大一的题目!!!
从键盘中键入两个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.


简化版,满足需求

热点排行