assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 32 dup (0)
stack ends
code segment
start:mov ax,12666 ;要显示的数据
mov bx,data
mov ds,bx ;ds指向段
mov bx,stack
mov ss,bx ;ss指向栈
mov sp,20h ;sp指向栈顶
mov si,0
call dtoc ;调用dtoc子程序
mov dh,8 ;要显示的位置 行
mov dl,3 ;要显示的位置 列
mov cl,2 ;显示的颜色 绿色
call show_str ;调用show_str子程序
mov ax,4c00h
int 21h
dtoc:push dx
push cx
push si ;子程序中使用的寄存器入栈
a:mov dx,0 ;被除数高16位
mov bx,10 ;除数
div bx ;ax中位商,dx为余数
inc si ;计数,记录入栈的个数
add dx,30h ;化为ASCII码
push dx ;余数入栈
mov cx,ax ;ax中的值给cx
jcxz b ;判断cx是否为0,为0,转到b,否则往下执行
jmp short a ;跳转到a
b:mov cx,si ;cx中储存循环次数
mov bx,0
c:pop ds:[bx] ;栈中数据出栈,存入data段中
inc bx ;后来出栈的数据的低16为把前面出栈的高16为覆盖
loop c
pop si
pop cx
pop dx ;子程序中使用的寄存器出栈
ret
show_str:mov ax,0B800H
mov es,ax ;es指向显示缓冲区
dec dh
mov al,0a0h
mul dh
dec dl
add dl,dl
mov dh,0
add ax,dx
mov bx,ax ;计算偏移地址
mov ah,cl ;ah暂时储存颜色
s:mov cl,ds:[si];字符放在cl中
mov ch,0
jcxz ok ;判断是否结束
mov ch,ah ;颜色放在ch中
mov es:[bx],cx;放于显示缓存区
add bx,2
inc si ;计数增加
jmp short s ;跳转
ok:ret
code ends
end start |