效果图如图:
代码如下:还不够精简,有空优化一下
assume cs:code,ds:data
data segment
dw 123,12666,1,8,3,38
db 32 dup(0);存储字符串
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
;重复处理data中内容6次,注意结尾要加0
mov cx,6
mov si,12;存入内存的偏移地址
mov bx,0;记录取出数字的位置
s: mov ax,[bx]
call dtoc
;在末尾加个,
mov ax,','
mov [si],ax
inc si
add bx,2
loop s
;在最后的结尾加0,以确保后续可以显示
sub si,1
mov ax,0
mov [si],ax
;显示字符串
mov dh,8
mov dl,3
mov cl,0c9h
mov di,12
call show_str
mov ax,4c00h
int 21h
;名称:dtoc
;功能:将ax中的数值转换为字符串形式写入ds:si空间中
;参数:(ax)=待转换数值 (si)=写入ds中的偏移地址
;返回值:无
dtoc: ;将ax中的数与10相除,取余数加30h写入[si],直到商为0
;1.保存数据
push dx
push cx
push bx
;2.操作
mov bx,0;记录有几个
s0: ;除10
mov dx,0;高位
mov cx,10;除数
call divdw
add cx,30h
push cx;余数入栈
inc bx
;若商为0,则跳出
mov cx,ax
jcxz ok0
jmp short s0
;写入数据
ok0:mov cx,bx
s2: pop ax
mov [si],ax
inc si
loop s2
;3.还原数据
pop bx
pop cx
pop dx
ret
;名称:divdw
;功能:实现32位除以16位且不会溢出
;参数:dx=高16位 ax=低16位 cx=除数
;返回:dx=结果的高16位 ax=结果的低16位 cx=余数
divdw: ;计算int(H/N)*65536
push bx ;储存好bx的值
push ax
;计算第一部分
mov ax,dx
mov dx,0
div cx
;计算第二部分
pop bx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx;还原bx
ret
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结尾的字符串(在ds:di中)
;参数:(dh)=行号(取值范围0-24) (dl)=列号(取值范围0-79) (cl)=颜色(具体取值翻看五彩字部分)(di)=字符串在ds中的偏移地址
;返回:无
show_str: ;保存需要用的寄存器
push dx
push cx
push bx
push si
push di
push ax
push es
;功能实现
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax ;bx为行地址
mov al,2
mul dl
mov si,ax ;si为列地址
;mov di,0 ;di为目前取到字符串的哪个位置
mov dl,cl ;用dl存放颜色
mov ch,0
s1: mov cl,[di]
inc di
jcxz ok1
mov ah,dl
mov al,cl
mov es:[bx+si],ax
add si,2
loop s1
;还原寄存器
ok1: pop es
pop ax
pop di
pop si
pop bx
pop cx
pop dx
ret
code ends
end start