回 帖 发 新 帖 刷新版面

主题:新手求救~!用汇编编写的一个简单程序~

题目很简单,但是怎么都不会~[em10]
高手们帮下忙吧,谢谢啦[em2]

题目:从键盘输入两个正整数,求两数和并输出。

回复列表 (共3个回复)

沙发

兄弟,这么简单的问题随便那个教材的习题上都有的。
程序就不写了 说一下思路吧
首先定义 三个变量 mesg1,mesg2和sum

21h 的1号功能调用两次从键盘接受两个正数
分别送给 mesg1,mesg2
然后在让他们相加就是了
结果送给sum
用21h的2号或者9号功能调用显示就是了

板凳

.386p
Seg_Data  SEGMENT  use16
     
     a      DW ?
     b      DW ?
     sum    DW ?
     message0   DB  "please enter first number!",0dh,0ah,'$'
     message1   DB  "please enter other number!",0dh,0ah,'$'
Seg_Data ENDS

Seg_Stack  SEGMENT  use16
      DW  512  dup  (?)
      Top  label  WORD
Seg_Stack  ENDS

Seg_Code SEGMENT use16
main proc far
     Assume  cs:Seg_Code , ds:Seg_Data , ss:Seg_Stack
 Start:
    mov    ax ,  Seg_Stack
    mov    ss ,  ax
    mov    sp ,  offset Top
    mov    ax ,  Seg_Data
    mov    ds ,  ax
    mov    es ,  ax


    mov    ah ,  9
    lea    dx ,  message0   
    int    21h    
    call   EnterDec
    mov       a,bx
    call   ShowDec 
    call   crlf

    mov    ah ,  9
    lea    dx ,  message1   
    int    21h    
    call   EnterDec
    mov       b,bx
    call   ShowDec 
    call   crlf
    mov    bx,a
    add       bx,b
    
    call    ShowDec 

    mov    ah,4ch
    int   21h 




main Endp


ShowDec  proc near
    mov cx, 10000d
    call Data_Div 
    mov cx, 1000d
    call Data_Div 
    mov cx, 100d
    call Data_Div 
    mov cx, 10d
    call Data_Div 
    mov cx, 1d
    call Data_Div 
    ret
ShowDec  Endp


Data_Div proc near
    mov  ax,bx
    mov  dx,0
    div  cx
    mov  bx,dx
    mov  dl,al
    add  dl,30h
    mov  ah,2h
    int  21h
    ret
Data_Div Endp
    
    
    
EnterDec   proc near
    mov  bx , 0
newchar:
    mov  ah , 1
    int  21h
    sub  al ,30h
    jl   exit
    cmp  al , 9d
    jg   exit
    cbw
    xchg ax ,bx
    mov  cx ,10d
    mul  cx
    xchg ax,bx
    add  bx,ax;
    jmp newchar
exit:
    ret
EnterDec  Endp

crlf  proc near
    mov dl ,0ah
    mov ah,02h
    int 21h
    
    mov dl,0dh
    mov ah,02h
    int 21h,
    ret
crlf    endp

    Seg_Code ENDS    
    END       start
        

我是这样做的,请高手指点指点 。

3 楼

我重新修改了一下.如下:

.386p
Seg_Data  SEGMENT  use16
     
     a      DW ?
     b      DW ?
     sum    DW ?
     message0   DB  "please enter first number!",0dh,0ah,'$'
     message1   DB  "please enter other number!",0dh,0ah,'$'
     message2   DB  "the sum of two data!",0dh,0ah,'$'
Seg_Data ENDS

Seg_Stack  SEGMENT  use16
      DW  512  dup  (?)
      Top  label  WORD
Seg_Stack  ENDS

Seg_Code SEGMENT use16
main proc far
     Assume  cs:Seg_Code , ds:Seg_Data , ss:Seg_Stack
 Start:
    mov    ax ,  Seg_Stack
    mov    ss ,  ax
    mov    sp ,  offset Top
    mov    ax ,  Seg_Data
    mov    ds ,  ax
    mov    es ,  ax


    mov    ah ,  9
    lea    dx ,  message0   
    int    21h    
    call   EnterDec
    mov       a,bx
    call   ShowDec 
    call   crlf

    mov    ah ,  9
    lea    dx ,  message1   
    int    21h    
    call   EnterDec
    mov       b,bx
    call   ShowDec 
    call   crlf

    mov    ah ,  9
    lea    dx ,  message2   
    int    21h    

    mov    bx,a
    add       bx,b    
    call    ShowDec 

    mov    ah,4ch
    int   21h 




main Endp


ShowDec  proc near
    mov cx, 10000d
    call Data_Div 
    mov cx, 1000d
    call Data_Div 
    mov cx, 100d
    call Data_Div 
    mov cx, 10d
    call Data_Div 
    mov cx, 1d
    call Data_Div 
    ret
ShowDec  Endp


Data_Div proc near
    mov  ax,bx
    mov  dx,0
    div  cx
    mov  bx,dx
    mov  dl,al
    add  dl,30h
        cmp  dl,'0'
    je   exit0
    mov  ah,2h
    int  21h
exit0:
    ret
Data_Div Endp
    
    
    
EnterDec   proc near
    mov  bx , 0
newchar:
    mov  ah , 1
    int  21h
    sub  al ,30h
    jl   exit
    cmp  al , 9d
    jg   exit
    cbw
    xchg ax ,bx
    mov  cx ,10d
    mul  cx
    xchg ax,bx
    add  bx,ax;
    jmp newchar
exit:
    ret
EnterDec  Endp

crlf  proc near
    mov dl ,0ah
    mov ah,02h
    int 21h
    
    mov dl,0dh
    mov ah,02h
    int 21h,
    ret
crlf    endp

    Seg_Code ENDS    
    END       start
        

我来回复

您尚未登录,请登录后再回复。点此登录或注册