. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  10.3  帮忙看看   一闪而过  谢谢  [待解决] 回复[ 3次 ]   点击[ 381次 ]  
static
[帖 主]   [ 发表时间:2011-01-01 20:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12
;dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=word型数据
;      ds:si指向字符串的首地址
; 返回:无
;应用举例:将数据12666以1进制的形式在屏幕的8行3列,用绿色显示出来。在现实时我们调用本次实验中的第一个子程序show_str
assume cs:code
data segment
        db 10 dup (0)
data ends

code segment
        start:
        mov ax,12666
        mov bx,data
        mov ds,bx
        mov si,0
        call dtoc
        
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str
        
        mov ax,4c0h
        int 21h
        
        dtoc:
        push ax
        push bx
        push cx
        push dx
        push si
        
        xor di,di
        xor bx,bx
        s0:
        mov dx,0
        mov bx,10
        div bx;dx存放余数 ax存放商
        add dx,30
        push dx
        inc di;做计数用
        ;需要处理一个循环判定
        mov cx,ax
        jcxz quit
        jmp short s0
        mov cx,di
        
        quit1:
        
        pop bx
        mov ds:[si],bl
        inc si
        loop quit1
        
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
        
        show_str:
        ;保护现场
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        
        ;计算显示位置,最终ax存放最终显示位置
        mov ax,0
        sub dh,1
        mov al,dh
        mov ah,160
        mul ah
        mov dh,0
        mov bx,ax
        sub dl,1
        mov al,dl
        mov ah,2
        mul ah
        add ax,bx
        
        ;准备显示字符串
        mov bx,0b800h
        mov es,bx
        mov di,ax
        xor bx,bx
        mov bl,cl
        ;设置字符以及字符属性
        s1:
        mov ch,ds:[si];ch存放字符
        mov es:[di],ch
        mov es:[di+1],bl;bl存放字符数形
        mov cl,0
        jcxz quit2
        inc si
        add di,2
        jmp short s1
        
        ;现场恢复
        quit2:
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
        code ends
        end start


一闪而过
masmaster
[第1楼]   [ 回复时间:2011-01-02 10:40 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
mov ax,4c0h      ;4c0h ≠ 4c00h
        int 21h
static
[第2楼]   [ 回复时间:2011-01-02 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12
谢谢
经过dubug单步跟踪发现有两个点错了,现把修改过后的发上来 
谢谢 masmmaster
;dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=word型数据
;      ds:si指向字符串的首地址
; 返回:无
;应用举例:将数据12666以1进制的形式在屏幕的8行3列,用绿色显示出来。在现实时我们调用本次实验中的第一个子程序show_str
assume cs:code
data segment
        db 10 dup (0)
data ends

code segment
        start:
        mov ax,12666
        mov bx,data
        mov ds,bx
        mov si,0
        call dtoc
        
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str
        
        mov ax,4c00h
        int 21h
        
        dtoc:
        push ax
        push bx
        push cx
        push dx
        push si
        
        xor di,di
        xor bx,bx
        s0:
        mov dx,0
        mov bx,10
        div bx;dx存放余数 ax存放商
        add dx,30h
        push dx
        inc di;做计数用
        ;需要处理一个循环判定
        mov cx,ax
        jcxz quit
        jmp short s0
        
        quit:
        mov cx,di
        so:
        pop bx
        mov ds:[si],bl
        inc si
        loop so
        
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
        
        show_str:
        ;保护现场
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        
        ;计算显示位置,最终ax存放最终显示位置
        mov ax,0
        sub dh,1
        mov al,dh
        mov ah,160
        mul ah
        mov dh,0
        mov bx,ax
        sub dl,1
        mov al,dl
        mov ah,2
        mul ah
        add ax,bx
        
        ;准备显示字符串
        mov bx,0b800h
        mov es,bx
        mov di,ax
        xor bx,bx
        mov bl,cl
        ;设置字符以及字符属性
        s1:
        mov ch,ds:[si];ch存放字符
        mov es:[di],ch
        mov es:[di+1],bl;bl存放字符数形
        mov cl,0
        jcxz quit2
        inc si
        add di,2
        jmp short s1
        
        ;现场恢复
        quit2:
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
        code ends
        end start

标注1:quit 陷入死循环,因为jcxz quit 
        jmp short s0 
        mov cx,di 
 跳过了对cx 的赋值
标记2: 30 为30h
还有三拉:4c00h
masmaster
[第3楼]   [ 回复时间:2011-01-02 23:08 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
good ~job~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved