回 帖 发 新 帖 刷新版面

主题:[讨论]求助高手:这段代码单步调试能通过,但无法运行。

这是王爽《汇编语言第二版》的实验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

回复列表 (共1个回复)

沙发

看样子,你和我刚学的时候遇到了一样的情况。

http://bbs.pfan.cn/post-319566.html这是我自己发的贴子,和你和遇到的情况一样

我来回复

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