回 帖 发 新 帖 刷新版面

主题:大家来帮忙,yey大哥请来看看,愿意给50分

以下的程序是关于加减运算器的程序,是yey大哥的帖子,小弟加上了乘法的运算,
但调不出来,请来帮帮忙





.model 
.stack
.code
a dw ?
b dw ?
c dw ?
d dw ?
e dw ?
f dw ?
g dw ?
esc_key equ 1bh
win_ulc equ 30
win_lrr equ 16
main proc far
     call clear_screen     ;调用clear_screen段
     mov dx,0
     mov ah,2
     mov dh,7
     mov dl,29
     mov bh,0
     int 10h               ;置光标位置
     mov ah,9
     mov al,'$'
     mov bh,0
     mov bl,0dah
     mov cx,21
     int 10h               ;在光标处,画了21个'$'作窗口的头装饰
     mov ah,2
     mov dh,7
     mov dl,30
     mov bh,0
     int 10h               ;再一次将光标置位
     mov cx,20
loop1:
     ;mov dl,'_'            
     ;mov ah,2
     ;int 21h
     ;loop loop1            ;画20个'-'作为窗口头边框
locate1:
     mov dx,0
     mov ax,0
     mov bx,0
     mov cx,0
     mov a,0
     mov b,0
     mov c,0
     mov d,0
     mov e,0
     mov dh,7
     mov cx,10
loop4:
     mov ah,2
     add dh,1
     mov dl,29
     mov bh,0
     int 10h
     mov dl,'|'
     mov ah,2
     int 21h
     loop loop4           
     mov dh,7
     mov cx,10
loop5:
      mov ah,2
      add dh,1
      mov dl,49
      mov bh,0
      int 10h
      mov dl,'|'
      mov ah,2
      int 21h
      loop loop5                  ;竖直画两列'|'作边框
      mov ah,2
      mov dh,17
      mov dl,30
      mov bh,0
      int 10h
      mov cx,19
loop2:
      ;mov ah,09
      ;mov dl,'$'
      ;mov bh,0
      ;mov bl,0dah
      ;mov cx,21
      ;int 10h
      ;mov dl,'_'
      mov ah,2
      int 21h
      loop loop2                ;在下一轮计算中,以上的段又重新画图,达到滚动目的                 

locate:  
      mov ah,2
      mov dh,16
      mov dl,30
      mov bh,0
      int 10h                 ;将光标置位
      mov dx,0
get_char:
        call decibin          ;调用decibin段
cheng:          
        cbw                   
        mov a,bx                      
        mov f,ax
        mov ax,0               
        mov bx,0              
        call decibin
        mov d,bx             
mul1: 
        mov ax,a
        mul d
        jmp calls        
jia:
        cbw                   ;将符号扩展
        mov a,bx              ;第一输进来的数存入a        
        mov b,ax              ;将运算符号存入b 
        mov bx,0
        mov ax,0              ;归零
        call decibin
        mov d,bx              ;第二个输进来的数存入d
        jmp  equal 

jian:    
         cbw
         mov a,bx
         mov c,ax             ;将运算符号存入c
         mov ax,0
         mov bx,0
         call decibin
         mov d,bx
equal:
         mov bx,a            ;释放第一个数
         mov ax,d            ;释放第二个数
         cmp b,'+'    
         jz add1
         cmp c,'-'
         jz sub1             ;比较符号进入相应的运算代码段
         cmp f,'*'
         jz mul1
add1:     cmp bx,ax
         jz  aa
       
aa:    cmp  ax,0
         jz tt2              ;如果输入都是0则转tt2
         jnz  tt3 
tt2:
        mov dl,'0'
        mov ah,2
        int 21h              ;输出0
        call scroll          ;进入下一轮计算
        jmp locate1          
tt3:
        add bx,ax            ;将结果存入bx寄存器
        jmp   calls
sub1:
        cmp bx,ax
        jl sub2               ;被减数小于减数
        jz sub4               ;被减数等于减数
        jg sub3               ;被减数大于减数
        jmp ff
ff:
        jmp jia
sub2:
        xchg bx,ax            ;将大的放在前面,交换,将永远保持存的是运算结果
        sub bx,ax
        mov dl,'-'
        mov ah,2
        int 21h
        call binihex          ;进入输出段
        call scroll
        jmp locate1
        jmp sub4
tt:
        jmp jian

sub4:
        mov dl,'0'
        mov ah,2
        int 21h
        call scroll
        jmp locate1   
sub3:
        sub bx,ax
        jmp calls              ;进入输出段
tt4:
      jmp equal

    
calls:      
       call binihex
       call scroll
       jmp locate1
exit2:
      mov ax,4c00h
      int 21h
        main endp

decibin proc near

newchar:
     mov ah,1
     int 21h                  ;输入数字
     cmp al,1bh               ;如果用户输入ESC则程序结束
     jz exit2
     cmp al,0dh               ;如果用户输入ENTER则换行
     jz hh2
     jmp hh1
hh2:
     call scroll              
hh1:
     cmp al,'+'               
     jz  ff 
     cmp al,'-'
     jz tt 
     cmp al,'*'
     jz cheng
     sub al,30h
     jl exit 
     cmp al,9d
     jg exit                  ;进行合法检验
     cmp al,'='
     jz tt4
     cbw
     xchg ax,bx               ;交换变量
     mov cx,10d
     mul cx                   ;将进来的数化作十进制储存
     xchg ax,bx               
     add bx,ax
     jmp newchar
exit:
     ret
     decibin endp
binihex proc near
        mov cx,10000d
        call dec_div
        mov cx,1000d
        call dec_div 
        mov cx,100d
        call dec_div
        mov cx,10d
        call dec_div
        mov cx,1d
        call dec_div
        ret
dec_div proc near
start2:    
    mov ax,bx
    mov dx,0                ;除法时dx为扩展寄存器
    div cx                  ;此时bx和dx存有结果
    cmp ax,0
    jg ii1
    cmp e,0
    jg ii1
    cmp ax,0 
    jz   ii
    mov bx,dx
    mov dl,al
    add dl,30h
    mov ah,2
    int 21h
ii:   
    ret                      ;若数的非末位为0则不输出,符合习惯
ii1: 
   cmp ax,0
   jz rr
   mov e,ax                  ;将最高位的数存入e
rr: 
   mov ax,bx                 
   mov dx,0
   div cx
   mov bx,dx                 ;bx存入了除后的结果
   mov dl,al
   add dl,30h
   mov ah,2
   int 21h                   ;输出                   
   ret   
    dec_div endp
    binihex endp
crlf proc near
     mov dl,0dh
     mov ah,2
     int 21h
     mov dl,0ah
     int 21h
     ret
     crlf endp
     cmp al,esc_key          ;输出格式
hh:
    scroll   proc  near
     mov ah,6
     mov al,1
     mov ch,8
     mov cl,30
     mov dh,16
     mov dl,50
     mov bh,7
     int 10h
     mov ah,2
     mov dh,win_lrr
     mov dl,win_ulc        ;模拟光标的运动
     mov bh,0
     int 10h
     ret
   scroll endp            ;换行命令,让屏幕滚动
    jmp hh1
jmp locate
   
   exit1:
     mov ax,4c00h
     int 21h
    
   clear_screen proc near     ;清屏,确定窗口的大小,为画出窗口做准备
      push ax
      push bx
      push cx
      push dx
      mov ah,6
      mov al,0
      mov bh,7
      mov ch,0
      mov cl,0
      mov dh,24
      mov dl,79
      int 10h
      mov dx,0                ;将光标置在首位置
      mov ah,2 
      int 10h
      pop dx
      pop cx
      pop bx
      pop ax
      ret
      clear_screen endp
      end main
 
[color=FF0000]cheng:          [/color]

回复列表 (共6个回复)

沙发

这个也忒长了啊,我迷糊中

板凳

;;modify by chenzep
;;编译器masm615
;;修改了3个地方
;;1:model的定义
;;2:c变量改为c1,我的编译器不能使用c作为变量
;;3:在mul1模块加了一句mov bx,ax

3 楼

.model small            
.stack
.code
a dw ?
b dw ?
c1 dw ?
d dw ?
e dw ?
f dw ?
g dw ?
esc_key equ 1bh
win_ulc equ 30
win_lrr equ 16
main proc far
     call clear_screen     ;调用clear_screen段
     mov dx,0
     mov ah,2
     mov dh,7
     mov dl,29
     mov bh,0
     int 10h               ;置光标位置
     mov ah,9
     mov al,'$'
     mov bh,0
     mov bl,0dah
     mov cx,21
     int 10h               ;在光标处,画了21个'$'作窗口的头装饰
     mov ah,2
     mov dh,7
     mov dl,30
     mov bh,0
     int 10h               ;再一次将光标置位
     mov cx,20
loop1:
     ;mov dl,'_'            
     ;mov ah,2
     ;int 21h
     ;loop loop1            ;画20个'-'作为窗口头边框
locate1:
     mov dx,0
     mov ax,0
     mov bx,0
     mov cx,0
     mov a,0
     mov b,0
     mov c1,0
     mov d,0
     mov e,0
     mov dh,7
     mov cx,10
loop4:
     mov ah,2
     add dh,1
     mov dl,29
     mov bh,0
     int 10h
     mov dl,'|'
     mov ah,2
     int 21h
     loop loop4           
     mov dh,7
     mov cx,10
loop5:
      mov ah,2
      add dh,1
      mov dl,49
      mov bh,0
      int 10h
      mov dl,'|'
      mov ah,2
      int 21h
      loop loop5                  ;竖直画两列'|'作边框
      mov ah,2
      mov dh,17
      mov dl,30
      mov bh,0
      int 10h
      mov cx,19
loop2:
      ;mov ah,09
      ;mov dl,'$'
      ;mov bh,0
      ;mov bl,0dah
      ;mov cx,21
      ;int 10h
      ;mov dl,'_'
      mov ah,2
      int 21h
      loop loop2                ;在下一轮计算中,以上的段又重新画图,达到滚动目的                 

locate:  
      mov ah,2
      mov dh,16
      mov dl,30
      mov bh,0
      int 10h                 ;将光标置位
      mov dx,0
get_char:
        call decibin          ;调用decibin段
cheng:          
        cbw                   
        mov a,bx                      
        mov f,ax
        mov ax,0               
        mov bx,0              
        call decibin
        mov d,bx  
        ;jmp  equal           
mul1: 
        mov ax,a
        mul d
        mov bx,ax               ;;;;;;;;;人家是输出BX,而不是AX
        jmp calls        
jia:
        cbw                   ;将符号扩展
        mov a,bx              ;第一输进来的数存入a        
        mov b,ax              ;将运算符号存入b 
        mov bx,0
        mov ax,0              ;归零
        call decibin
        mov d,bx              ;第二个输进来的数存入d
        jmp  equal 

jian:    
         cbw
         mov a,bx
         mov c1,ax             ;将运算符号存入c
         mov ax,0
         mov bx,0
         call decibin
         mov d,bx
equal:
         mov bx,a            ;释放第一个数
         mov ax,d            ;释放第二个数
         cmp b,'+'    
         jz add1
         cmp c1,'-'
         jz sub1             ;比较符号进入相应的运算代码段
         cmp f,'*'
         jz mul1
add1:     cmp bx,ax
         jz  aa
       
aa:    cmp  ax,0
         jz tt2              ;如果输入都是0则转tt2
         jnz  tt3 
tt2:
        mov dl,'0'
        mov ah,2
        int 21h              ;输出0
        call scroll          ;进入下一轮计算
        jmp locate1          
tt3:
        add bx,ax            ;将结果存入bx寄存器
        jmp   calls
sub1:
        cmp bx,ax
        jl sub2               ;被减数小于减数
        jz sub4               ;被减数等于减数
        jg sub3               ;被减数大于减数
        jmp ff
ff:
        jmp jia
sub2:
        xchg bx,ax            ;将大的放在前面,交换,将永远保持存的是运算结果
        sub bx,ax
        mov dl,'-'
        mov ah,2
        int 21h
        call binihex          ;进入输出段
        call scroll
        jmp locate1
        jmp sub4
tt:
        jmp jian

sub4:
        mov dl,'0'
        mov ah,2
        int 21h
        call scroll
        jmp locate1   
sub3:
        sub bx,ax
        jmp calls              ;进入输出段
tt4:
      jmp equal

    
calls:      
       call binihex
       call scroll
       jmp locate1
exit2:
      mov ax,4c00h
      int 21h
        main endp

decibin proc near

newchar:
     mov ah,1
     int 21h                  ;输入数字
     cmp al,1bh               ;如果用户输入ESC则程序结束
     jz exit2
     cmp al,0dh               ;如果用户输入ENTER则换行
     jz hh2
     jmp hh1
hh2:
     call scroll              
hh1:
     cmp al,'+'               
     jz  ff 
     cmp al,'-'
     jz tt 
     cmp al,'*'
     jz cheng
     sub al,30h
     jl exit 
     cmp al,9d
     jg exit                  ;进行合法检验
     cmp al,'='
     jz tt4
     cbw
     xchg ax,bx               ;交换变量
     mov cx,10d
     mul cx                   ;将进来的数化作十进制储存
     xchg ax,bx               
     add bx,ax
     jmp newchar
exit:
     ret
     decibin endp
binihex proc near
        mov cx,10000d
        call dec_div
        mov cx,1000d
        call dec_div 
        mov cx,100d
        call dec_div
        mov cx,10d
        call dec_div
        mov cx,1d
        call dec_div
        ret
dec_div proc near
start2:    
    mov ax,bx
    mov dx,0                ;除法时dx为扩展寄存器
    div cx                  ;此时bx和dx存有结果
    cmp ax,0
    jg ii1
    cmp e,0
    jg ii1
    cmp ax,0 
    jz   ii
    mov bx,dx
    mov dl,al
    add dl,30h
    mov ah,2
    int 21h
ii:   
    ret                      ;若数的非末位为0则不输出,符合习惯
ii1: 
   cmp ax,0
   jz rr
   mov e,ax                  ;将最高位的数存入e
rr: 
   mov ax,bx                 
   mov dx,0
   div cx
   mov bx,dx                 ;bx存入了除后的结果
   mov dl,al
   add dl,30h
   mov ah,2
   int 21h                   ;输出                   
   ret   
    dec_div endp
    binihex endp
crlf proc near
     mov dl,0dh
     mov ah,2
     int 21h
     mov dl,0ah
     int 21h
     ret
     crlf endp
     cmp al,esc_key          ;输出格式
hh:
    scroll   proc  near
     mov ah,6
     mov al,1
     mov ch,8
     mov cl,30
     mov dh,16
     mov dl,50
     mov bh,7
     int 10h
     mov ah,2
     mov dh,win_lrr
     mov dl,win_ulc        ;模拟光标的运动
     mov bh,0
     int 10h
     ret
   scroll endp            ;换行命令,让屏幕滚动
    jmp hh1
jmp locate
   
   exit1:
     mov ax,4c00h
     int 21h
    
   clear_screen proc near     ;清屏,确定窗口的大小,为画出窗口做准备
      push ax
      push bx
      push cx
      push dx
      mov ah,6
      mov al,0
      mov bh,7
      mov ch,0
      mov cl,0
      mov dh,24
      mov dl,79
      int 10h
      mov dx,0                ;将光标置在首位置
      mov ah,2 
      int 10h
      pop dx
      pop cx
      pop bx
      pop ax
      ret
      clear_screen endp
      end main

4 楼

谢谢你,但是程序仍然不能运行,masm调试出现以下
1.asm<217>:error A2053:jump out of range  by 121 byte<s>
这是什么原因?
而且  .model small 不加small也可以运行
我不懂什么编译原理因为我们下学期才学,这个据老师说也是要用编译原理的,这种题我还能不能做?而且最近要交大作业,怎么办?

5 楼

关键是人家输出的是BX,而你计算的结果是放到AX中去的.
你用的是什么的编译器,低于Masm6.0的就不要用了

6 楼

真的好长啊!我发的没人看啊!真郁闷!我看你蛮厉害的,学多久了?

我来回复

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