回 帖 发 新 帖 刷新版面

主题:大家帮忙看个程序

通过键盘输入两个整数  然后按1作加法运算 按2作减法运算 按3做乘法运算 按4作除法运算    我是通过一个地址表选择的 但是输入两个数后算不出结果来  我觉得可能是缓冲区被改变了  大家帮忙看一下 谢了

data segment
buff dw 8 dup(0)
     dw '$'
buff1 dw 4 dup(0)
      dw 'h',0DH,0AH,'$'
comtab dw com1,com2,com3,com4    
mess0 db 'Please input:$'
mess1 db 'A=$'
mess2 db 'B=$'
mess3 db '(1) add:$'
mess4 db '(2) sub:$'
mess5 db '(3) mul:$'
mess6 db '(4) div:$'
mess7 db 'error.$'
data ends
;
code segment
assume cs:code,ds:data
start:
     mov  ax,data
     mov  ds,ax
     mov  dx,offset mess0
     call A1
     mov  dx,offset mess1
     call A1
     mov  dx,offset buff
     call A2
     mov  bx,offset buff
     call A6
     mov  buff,ax
     call newline
     mov  dx,offset mess2
     call A1
     call A2
     call newline
     mov  bx,offset buff
     call A6
     mov  buff+1,ax
    
     mov  dx,offset mess3
     call A1
     mov  dx,offset mess4
     call A1
     mov  dx,offset mess5
     call A1
     mov  dx,offset mess6
     call A1
     call A4 ;通过键盘输入 选择做那项功能运算
     mov  dl,al
     xor  dh,dh
     call A3
     sub  al,1
     xor  ah,ah
   
     mov  bx,ax
     jmp  comtab[bx]

com1:  ;加法运算
     push ax
     push bx
     mov  ax,buff
     mov  bx,buff+1
     add  ax,bx
   
     mov  bx,offset buff1
     call A5
     call newline
     mov  dx,offset buff1
     mov  ah,9
     int  21h
     pop  bx
     pop  ax
     jmp  OK

com2:   ;减法运算
     push ax
     push bx
     mov  ax,buff
     mov  bx,buff+1
     sub  ax,bx
     mov  bx,offset buff1
     call A5
     call newline
     mov  dx,offset buff1
     mov  ah,9
     int  21h
     pop  bx
     pop  ax
     jmp  OK
com3:    ;乘法运算
     push ax
     push bx
     mov  ax,buff
     mov  bx,buff+1
     mul  bx
    
     mov  bx,offset buff1
     call A5
     call newline
     mov  dx,offset buff1
     mov  ah,9
     int  21h
     pop  bx
     pop  ax
     jmp  OK
com4:     ;除法运算
     push ax
     push bx
     mov  ax,buff
     mov  bx,buff+1
     
     div  bl
   
     mov  bx,offset buff1
     call A5
     call newline
     mov  dx,offset buff1
     mov  ah,9
     int  21h
     pop  bx
     pop  ax
     jmp  OK
OK:    
     mov  ax,4ch
     int  21h

A1 proc; 9号功能调用,显示一个字符串
     mov  AH,9
     int  21h
     ret
A1 endp
A2 proc   ;
     mov  ah,0ah
     int  21h
     ret
A2 endp     
newline proc;通过显示回车符形成回车,通过显示换行符形成换行
    push ax
    push dx
    mov  dl,0dh
    mov  ah,2
    int  21h
    mov  dl,0ah
    mov  ah,2
    int  21h
    pop  dx
    pop  ax  
    
    ret
newline endp
A3 proc ;把ASCII码转换成二进制数形式
    mov al,dh
    and al,0fh
    mov ah,10
    mul ah
    mov ah,dl
    and ah,0fh
    add al,ah
    ret
A3 endp
           
A4 proc ;1号功能调用,通过键盘输入一个字符
    mov ah,1
    int 21h
    ret
A4 endp
error proc
    push dx
    mov dx,offset mess7
    call A1
    pop dx
    ret
error endp
A5 proc ;把16位二进制数转换为5位十进制数ASCII码
    mov si,5
    mov cx,10
btoasc1:
    xor dx,dx
    div cx
    add dl,30h
    dec si
    mov [bx][si],dl
    or  si,si
    jnz btoasc1
    ret
A5  endp
A6  proc ;把用ASCII码表示的十进制数字符串转换成为二进制数
    push bx
    push cx
    push dx
    xor  ax,ax
    mov  cl,[bx]
    inc  bx
    xor  ch,ch
    jcxz dtobin2
dtobin1:
    mov dx,10
    mul dx
    mov dl,[bx]
    inc bx
    and dl,0fh
    xor dh,dh
    add ax,dx
    loop dtobin1
dtobin2:
    pop dx
    pop cx
    pop bx
    ret
A6  endp
   
code ends
end start

回复列表 (共4个回复)

沙发

哎呀 好久没有看汇编了,帮不上哦,不过要是有时间倒是很想再学学哈

板凳

看后受益非浅啊
看了楼主的程序之后,终于明白了call与ret的作用了
谢谢了

3 楼

复制下来
以后再好好研究一下

4 楼

你的A2函数要用到10号调用,用10号调用时缓冲区要有固定的格式。所以你的缓冲区应定义为:
data segment
buff dw 8 
     dw ?   //这里‘?’由系统装填。
     dw 8 dup(?)
     ............
     ............

我来回复

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