回 帖 发 新 帖 刷新版面

主题:这个程序有什么错误啊??

;要求:
;主程序mainpro允许用户在键盘上输入零件数量和单价
;子程序subconv把ascii码装换为二进制数
;子程序subclac计算出零件的价格
;子程序subdisp把二进制表示的单价转换为十进制数并显示出结果
data    segment
mes1    db    'Please input the number:','$'
mes2    db    'Please input the price:','$'
data    ends
;...................
stack    segment
sta        db        32 dup(0)                                            
sp_top      db        0 
stack    ends
;...................
code    segment
mainpro    proc    far
        assume    cs:code,    ss:stack,    ds:data
start:    mov    ax,data
        mov    ds,ax
        mov    ax,stack
        mov    ss,ax
        mov sp,offset sp_top
        
        mov    dx,offset    mes1    ;number
        mov ah,09h             
        int    21h
        
        mov ah,01h    ;输入数量
        int 21
        call subconv    ;ascii装换为二进制
        mov bl,al
        mov    dx,offset    mes2    ;price
        mov    ah,09h
        int    21h
        mov    ah,01h    ;输入价格
        int 21h
        
        call subconv    ;ascii装换为二进制
        call subclac    ;计算零件价格
        call subdisp    ;二进制转换为十进制并显示
        
        mov    ax,4c00h
        int 21h
mainpro    endp
;------------------
subconv proc    near    ;ascii装换为二进制
        and    al,0fh
subconv    endp
;-------------------
subclac    proc    near    ;计算零件价格        
        mul    bl
        aam
subclac    endp    
;-----------------
subdisp proc    near    ;二进制转换为十进制并显示
        or    ax,3030h        
        mov    dl,ah        ;输出结果的高位
        mov    ah,02h
        int 21h
        mov    dl,al        ;输出结果的低位
        mov    ah,02h
        int 21h
subdisp    endp
;----------------
code    ends
;.......................
        end    start

回复列表 (共4个回复)

沙发

1。 mov ah,01h    ;输入数量
        int 21
;////// int 21h

2。 所有子程序没有ret返回
subconv proc    near    ;ascii装换为二进制
        and    al,0fh
;///////ret         
subconv    endp

3。用bx来保存,int 21h此时ax的数据已经被更改了
subdisp proc    near    ;二进制转换为十进制并显示
        or    ax,3030h   
;mov bx,ax     
        mov    dl,ah        ;输出结果的高位
;mov dl,bh
        mov    ah,02h
        int 21h//////////////////////此时ax的数据已经被更改了
        mov    dl,al        ;输出结果的低位
;mov dl,bl
        mov    ah,02h
        int 21h
;ret
subdisp    endp

板凳

data    segment
mes1    db    'Please input the number:',0dh,0ah,'$'
mes2    db    'Please input the price:',0dh,0ah,'$'
cr      db   0dh,0ah,'$'
data    ends
;...................
stack    segment
sta        db        32 dup(0)                                            
sp_top      db        0 
stack    ends
;...................
code    segment
mainpro    proc    far
        assume    cs:code,    ss:stack,    ds:data
start:   
    mov    ax,data
        mov    ds,ax
        mov    ax,stack
        mov    ss,ax
        mov sp,offset sp_top
        
        mov    dx,offset    mes1    ;number
        mov ah,09h             
        int    21h
    
        
        mov ah,01h    ;输入数量
        int 21h
        call subconv    ;ascii装换为二进制
        mov bl,al
        mov    dx,offset    mes2    ;price
        mov    ah,09h
        int    21h
        mov    ah,01h    ;输入价格
        int 21h
        
        call subconv    ;ascii装换为二进制
        call subclac    ;计算零件价格
    mov bx,ax ;/////要么使用bx,要么压栈保存
        call subdisp    ;二进制转换为十进制并显示
        

        mov    ax,4c00h
        int 21h
mainpro    endp
;------------------
subconv proc    near    ;ascii装换为二进制
        and    al,0fh
    ret
subconv    endp
;-------------------
subclac    proc    near    ;计算零件价格        
        mul    bl
        aam
    ret
subclac    endp    
;-----------------
subdisp proc    near    ;二进制转换为十进制并显示

mov    dx,offset  cr   ;换行
        mov ah,09h             
        int    21h

        or    bx,3030h 
    
        mov    dl,bh        ;输出结果的高位
        mov    ah,02h
        int 21h
        mov    dl,bl        ;输出结果的低位
        mov    ah,02h
        int 21h
    ret
subdisp    endp
;----------------
code    ends
;.......................
        end    mainpro 
;结尾不是end    start,是 end    mainpro

3 楼

;结尾不是end    start,是 end    mainpro
---------
主程序mainpro不是在mainpro    endp就结束了吗
我看书上最后都是end start啊?

4 楼

二楼 是 改后的程序 可以通过编译,


还有 因为是mainpro    proc    far开头的,所以结尾是end    mainpro,
不信,你编译试试。我用的是masm6.11

我来回复

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