| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 485 人关注过本帖
标题:王爽实验10.3的一个问题
只看楼主 加入收藏
jxsniper
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-3-25
收藏
 问题点数:0 回复次数:0 
王爽实验10.3的一个问题
目的:将12666反序以ASCII码形式显示
以下代码能编译链接,但无法运行,请高手指点。
data    segment
    db 10 dup (0)
data    ends

assume    cs:code
code    segment
start:   
    mov    bx,data
    mov    ds, bx
    mov    si, 0
    mov    ax, 12666
    call    dtoc

    mov    dh, 8
    mov    dl, 3
    mov    cl, 2
    call    show_str

    mov    ax, 4c00h
    int    21h

;名称:dtoc
;功能:二进数制转化为十进制数
;参数:ax:二进制数,ds:[si]:十进制数
dtoc:    push    cx            ;保存CX的值

s1:     mov    cx, 10       ;除数10
    call    divdw
    add    cx, 30h        ;余数加30H
    mov    ds:[si], cx        ;放入data段中
    inc    si
    mov    cx, ax        ;商存入cx
    jcxz    enddiv        ;如果商为0则停止循环
    jmp    short s1
enddiv:
    mov    si, 0        ;数据段指针归零
    pop    cx
    ret

;名称:divdw
;功能:防止溢出的除法
;参数:dx:商的高16位,ax:商的低16位,cx:余数
divdw:     push    dx
    push    si

    push    ax            ;保存g
    mov    ax, dx        ;被除数低16位为H        
    mov    dx, 0h        ;被除数高16位为0
    div    cx            ;int(H/N)=ax, rem(H/N)=dx
    push    dx            ;保存rem(H/N)
    push    ax            ;保存int(H/N)
    mov    bx, 0ffffh
    mul    bx            ;dx.ax = int(H/N) * (65536-1) 避免乘法溢出
    pop    bx            ;bx = int(H/N)
    add    ax, bx        ;ax = int(H/N) *65536的低16位,相加产生进位
    adc    dx, 0h        ;dx = dx+0+CF
    mov    si, dx
    mov    di, ax        ;si.di = int(H/N)*65536

    pop    ax            ;ax = rem(H/N)
    push    ax
    mov    bx, 0ffffh
    mul    bx            ;dx.ax = rem(H/N)*(65536-1)
    pop    bx            ;bx = rem(H/N)
    add    ax, bx        ;ax = rem(H/N)*65536的低16位,相加产生进位
    adc    dx, 0h        ;dx = dx+0+CF
    pop    bx            ;bx = L
    add    ax, bx        ;ax = rem(H/N)*65536+L 的低16位
    div    cx               
        
    add    ax, di        ;ax = X/N的低16位
    mov    cx, dx        ;cx = 余数
    mov    dx, si        ;dx = X/N的高16位

    pop    si
    pop    dx
    ret

;名称:show_str
;功能:显示字符串
;参数:ds:[si]:要显示的字符串,es:[di]:屏幕显示缓冲区
; dh:行数,dl:列数,cl:颜色属性
show_str:
    mov    ax, 0b800h        ;缓冲区起始段地址
    mov    es, ax
    mov    al, 0a0h          ;al = 160   
    mul    dh                ;ax = (dh-1)*al = (8-1)*160
    mov    di, ax
    mov    al, 2h
    dec    dl
    mul    dl                ;ax = (dl-1)*al
    add    di, ax            ;8行3列的偏移地址送入di
    mov    dl, cl            ;颜色属性放入dl
    mov    cx, 5h

    s0:    mov    al, ds:[si]
    mov    es:[di], al        ;字符
    inc    di
    mov    es:[di], dl        ;颜色
    inc    di
    inc    si
    loop    s0
   
    ret

code    ends
end    start
搜索更多相关主题的帖子: 实验 王爽 
2010-03-25 16:30
快速回复:王爽实验10.3的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025672 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved