;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