;object: change number to string and put teh string to the screen
;writer: mike
;time: 2020.11.02
assume cs:code,ds:data,ss:stack
data segment
dw 1234
data ends
data1 segment
db '0000000000',0
data1 ends
stack segment stack
db 30 dup(0)
stack ends
code segment
;数据从哪里来
start: mov ax,data
mov ds,ax
mov si,0
;数据到那里去
mov ax,data1
mov es,ax
mov di,10 ;从最后一位开始输入
mov ax,ds:[si] ;将内容放到寄存器,用于除法
mov dx,0
call shortDiv ;调用函数
mov bx,data1 ;将内存中的字符串显示在屏幕上
mov ds,bx ;数据从哪里来
mov si,di ;其实di是1
mov bx,0B800H ;数据到那里去,显示在屏幕上
mov es,bx
mov di,160*10
add di,40*2
call showString
mov ax,4c00H
int 21H
;===================================
shortDiv: mov cx,10
div cx ;结果放在ax中
add dl,30H ;将余数数字,变成数字字符串,这里用的是16位除法,这里cx是16位
sub di,1 ;修改栈顶标记
mov es:[di],dl ;将结果放进内存
mov cx,ax ;jcxz比较的是cx
jcxz shortDivRet ;比较商是不是得零
mov dx,0 ;如果商不是零,也就是没有除到最后,重新将余数存储器归为0
jmp shortDiv ;重新循环程序,这里ax默认已经放上了除法之后的商。
shortDivRet: ret
;=======================================
showString: push cx
push ds
push si
push es
push di ;将寄存器入栈
mov cx,0 ;初始化cx
showString1: mov cl,ds:[si] ;检查是否到字符串的最后
jcxz showStringRet
mov es:[di+0],cl ;将内存中的字符串送到屏幕上
mov byte ptr es:[di+1],00000010B ;给字符串加上颜色
add di,2 ;不明白为什么是加2?
inc si
jmp showString1
showStringRet: pop di
pop es
pop si
pop ds
pop cx
ret
code ends
end start
end
![]()