王爽实验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