assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov dx,123 ;方便以后显示大于65525的数据,做16位除法运算,di为被除数高16位
mov bx,data
mov ds,bx
sub si,si
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
;输出指定字符与颜色到指定位置
show_str:
push cx
push dx
add dh,3
mov al,0AH
mul dh
mov ah,0b8H
mov es,ax
mov al,2
mul dl
mov si,ax
sub bx,bx
show:
push cx
mov al,[bx]
sub ch,ch
mov cl,al
jcxz ok
pop cx
mov es:[si],al
mov es:[si].1,cl;00000010b绿色
inc si
inc si
inc bx
jmp short show
ok:
pop dx
pop cx
ret
;防止除法溢出,并保护子程序中将用到的寄存器
dtoc:
push ax
push dx
push si
push ax
push bx
push bp
s:
push ax
mov bx,10 ;转化十进制,被除数-除数=余为要显示的字符串
mov ax,dx ;要计算被除数高16位
sub dx,dx
div bx ;高16位结果的余数
mov bp,ax ;暂存高16位的商
pop ax ;还原被除数低16位
div bx ;(高16位余数+低16位原被除数)/n 得出商
add dx,30H ;ascii码
;判断跳转
mov [si],dl ;改变原字符串的字符,转化为要显示的十进制字符
push dx
mov dx,bp ;还原高16位的商
mov cx,ax
jcxz o
inc si
jmp short s ;循环至jcxz o指令跳转
;进行数值倒序,还原子程序中用到的寄存器,子程序运行结束
o:
inc si
mov cx,si
sub si,si ;归0
x:
pop [si]
inc si
loop x
pop bp
pop bx
pop ax
pop si
pop dx
pop ax
ret
code ends
end start
;debug调试时候如果要执行g命令请g 到第一个ret的位置(就是跳转到mov ax,4c00h指令的那一个ret) |