实验10的第3题,代码越来越长。不知到win32汇编是啥状况。
;名称:dtoc
;功能:将word型数据变为十进制字符串,0结尾
;参数:(ax) = word型数据
; ds:si 串首
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
mov si,0
call show_str;调用输出子程序
mov ax,4c00h
int 21h
dtoc:
push cx
s0: mov cx,ax
jcxz ok1;被除数为0表示循环结束,跳出
mov bx,10;12666/10=1266>256,商要用(ax)保存,所以除数要16位(bx),不能(bl)
xor dx,dx;12666<65536,除数16位,则被除数必须用到(dx),12666<65536,(dx)置0即可
div bx;除后的结果 (ax)...(dx)
push dx;保存余数,并将(ax)作为下次循环的被除数
inc si;记录循环次数,求得字符串长度
jmp short s0
ok1: mov cx,si
xor si,si
s1: pop ds:[si];依次出栈,将字符串顺序保存到ds:[si]中
mov bl,30h
add ds:[si],bl;数值转换为对应ASCII码
inc si
loop s1
mov ds:[si],cx;将0保存到字符串结尾
pop cx
ret
show_str:;输出字符串子程序
push ax
push es
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov ah,cl
xor cx,cx
s2: mov cl,ds:[si]
jcxz ok2
mov al,cl
mov es:[bx],ax
inc si
add bx,2
jmp short s2
ok2: pop es
pop ax
ret
code ends
end start
|