汇编网首页登录博客注册
caroline0712的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2009-03-28 08:55] 第十章实验十程序三

;数值显示  改进版
;将DATA中的数据以十进制显示;
;将二进制信息存储的数据变为十进制形式的字符串
;
DATAS SEGMENT
    DB 6 DUP (0);用AX存储数据,最大为5位 ,所以分配6个db 
DATAS ENDS

STACKS SEGMENT
    DW 14 DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,12666
    MOV BX,DATAS
    MOV DS,BX    
    MOV SI,0
    CALL DTOC
    
    MOV DH,8
    MOV DL,3
    MOV CL,01110001B
   CALL show_str
          
    MOV AH,4CH
    INT 21H
DTOC: 
    PUSH AX
    PUSH BX   
    PUSH CX
    PUSH DX     
    PUSH SI

DTOC_START:
    MOV  DX,0 ;        
        MOV  BX,10
        DIV  BX
        MOV  CX,AX
        ADD  DX,30H
        INC  SI
        PUSH DX
        JCXZ DTOC_END
        INC cx
        LOOP DTOC_START
DTOC_END:
        MOV CX,SI
        MOV SI,0
TURN: 
    POP DX 
        MOV DS:[SI],DL
        INC SI
        LOOP TURN
        MOV DS:[SI],0H
            
    POP SI
    POP DX
    POP CX
    POP BX
    POP AX
        RET
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW_STR:
;把用到的寄存器入栈
        PUSH AX
        PUSH DX
        PUSH SI 
        PUSH CX                
;和显存关联        
        MOV AX,0B800H
        MOV ES,AX
        mov SI,0
        MOV BX,0
        MOV AL,CL;将颜色设置到AL中        
s:         
    MOV CL,DS:[SI]
    MOV CH,0
    JCXZ OK  ;判断是否为0    
   ;输出几列 循环几次
   PUSH DX
   MOV CL,DL
   MOV DH,0
   MOV CX,DX  
   PUSH CX  
   MOV DI,DX
   SUB DI,DI
   
CONT:
    PUSH CX ;CONT 计数
    MOV CL,DS:[SI] 
    mov ES:[DI][BX],CL;传数据   
    MOV ES:[DI+1][BX],AL;设置颜色
        INC SI
        ADD DI,2
        POP CX
        LOOP CONT
        
        ADD BX,16
        POP CX
        POP DX        
        LOOP S 
        
OK:        POP CX
        POP SI        
        POP DX
        POP AX
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODES ENDS
    END START
评论次数(3)  |  浏览次数(709)  |  类型(汇编作业) |  收藏此文  | 

[  crazyman   发表于  2009-03-30 15:26  ]

你的程序还存在编译错误。另外,通过观察你的程序,也许只实现了dx为0的32位除法,对于dx大于0aH的数据,应该同样存在溢出错误的。当然,这是对程序的一个更高的要求,因为后面的课程设计会用到这个子程序功能,所以,在完成12666基本的数据要求后,考虑改进一下,让程序适应更大的数据。

[  caroline0712   发表于  2009-03-30 15:42  ]

回复Crazyman:你编译的方法对吗?我编译没有错误

[  caroline0712   发表于  2009-03-30 15:47  ]

;数值显示  改进版()显示部分的改进)
;将DATA中的数据以十进制显示;
;将二进制信息存储的数据变为十进制形式的字符串
;
DATAS SEGMENT
    DB 6 DUP (0);用AX存储数据,最大为5位 ,所以分配6个db 
DATAS ENDS

STACKS SEGMENT
    DW 14 DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,12666
    MOV BX,DATAS
    MOV DS,BX    
    MOV SI,0
    CALL DTOC
    
    MOV DH,8
    MOV DL,3
    MOV CL,01110001B
   CALL show_str
          
    MOV AH,4CH
    INT 21H
DTOC: 
    PUSH AX
    PUSH BX   
    PUSH CX
    PUSH DX     
    PUSH SI

DTOC_START:
    MOV  DX,0 ;    
    MOV  BX,10
    DIV  BX
    MOV  CX,AX
    ADD  DX,30H
    INC  SI
    PUSH DX
    JCXZ DTOC_END
    INC cx
    LOOP DTOC_START
DTOC_END:
    MOV CX,SI
    MOV SI,0
TURN: 
    POP DX 
    MOV DS:[SI],DL
    INC SI
    LOOP TURN
    MOV DS:[SI],0H
        
    POP SI
    POP DX
    POP CX
    POP BX
    POP AX
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW_STR:
        PUSH AX
        PUSH SI 
        PUSH CX
        PUSH DX
        
        MOV AX,0B800H
        MOV ES,AX
    
    MOV AX,160
    MUL        DH
    ADD DL,DL
    MOV DH,0
    
        ADD AX,DX        
        MOV DI,AX
    MOV SI,0                        
        MOV AL,CL
        ;判断是否是0,终止
        
JUDGE:
        MOV CL,DS:[SI]
        MOV CH,0 
        JCXZ COPYDATAEND                             
    MOV ES:[DI],CL
    MOV ES:[DI+1],AL
        ADD SI,1
        ADD DI,2
        INC CX
        LOOP JUDGE
                
COPYDATAEND:
    POP DX        
        POP CX
        POP SI
        POP AX
    RET        
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODES ENDS
    END START

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码