满意答案
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,stack
mov ss,bx
mov sp,16
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push ax
push cx
push dx
push si
xor si,si
s0:mov cx,10 ;除数赋给cx
mov dx,0
;以下操作取字符
call divdw ;调用不产生溢出的除法运算
add cx,30h
push cx ;cx中保存的是子程序调用后得到的余数,入栈
inc si ;使用si记录有多少位数
mov cx,ax ;将商赋给cx,判断各位的数值是否全部求出
jcxz ok0
jmp short s0
ok0:mov cx,si
xor si,si ;以下将得到各位数值保存到内存单元中
s1: pop ax
mov [si],al
inc si
loop s1
mov byte ptr [si],0
pop si
pop dx
pop cx
pop ax
ret ;返回
divdw:push bx ;用bx暂存,先将其入栈,程序结束时还原原值
push ax ;将被除数的低16位入栈,下一步计算时用
;以下进行被除数高16位与除数的除法运算
mov ax,dx ;将被除数的高16位赋给ax
xor dx,dx ;被除数的高16位清零
div cx
mov bx,ax ;将高位的商暂存在bx中
;以下进行被除数低16位与除数的除法运算
pop ax ;将被除数低16位放入ax中,上步计算的余数作为本次运算的高16位,已默认在dx中
div cx ;商在ax中,余数在dx中
;按程序要求将结果保存
mov cx,dx ;cx中保存结果的余数
mov dx,bx ;dx中保存结果的高16位,ax中保存着结果的低16位
pop bx ; 还原bx中的值
ret
show_str:push ax
push bx
push cx
push dx
push es
mov ax,0b800h
mov es,ax
dec dh
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
sub ax,2
add bx,ax
mov di,0
mov al,cl
s2: mov cl,[si]
mov ch,0
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short s2
ok: pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
00分享举报