assume cs:codesg
stacksg segment
dw 16 dup(0)
stacksg ends
datasg segment
db 10 dup (0)
datasg ends
datasg2 segment
dw 123,12666,1,8,3,38
datasg2 ends
codesg segment
start: mov ax,stacksg
mov ss,ax
mov sp,32
mov ax,datasg
mov ds,ax
mov si,0
mov ax,datasg2
mov es,ax
mov di,0
mov bl,2
mov cx,6
start_s:push cx
mov ax,es:[di]
mov dx,0
call dtoc
mov dh,bl
mov dl,3
mov cl,2
call show_str
inc bl
add di,2
pop cx
loop start_s
mov ax,4c00h
int 21h
;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0结尾符
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位
; ds:si指向字符串的首地址
;返回:无
dtoc: push ax
push bx
push cx
push dx
push si
mov bx,0 ;用计数
dtoc_s: mov cx,10
call divdw
;返回:(dx)=结果的高16位,(ax)=结果的低16位
;(cx)=余数
add cx,30h ;转换为对于的ascii码
push cx ;余数入栈
inc bx
mov cx,dx ;判断结果的高16位是否为0
jcxz dtoc_s0
jmp short dtoc_s ;不为零继续进行除法运算
dtoc_s0:mov cx,ax ;判断结果的低16位是否为0
jcxz dtoc_s1
jmp short dtoc_s ;不为零继续进行除法运算
dtoc_s1: mov cx,bx
dtoc_s2:
pop ax
mov [si],al
inc si
loop dtoc_s2
inc si
mov al,0
mov [si],al ;最后加个0作为结尾
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围1~25),(dl)=列号(取值范围1-80),
; (cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str: push ax
push bx
push cx
push dx
push es
push di
mov ax,0b800h
mov es,ax
sub dh,1
mov al,dh
mov ah,160
mul ah
mov bx,ax ;bx=((dh)-1)*160
sub dl,1
mov al,dl
mov ah,2
mul ah
add bx,ax ;bx=((dh)-1)*160+((dl)-1)*2
mov di,bx ;计算出的显示的位置
mov al,cl ;al=cl 要设置显示的颜色
show_str_s: mov cl,[si]
mov ch,0
jcxz show_str_ok ;判断读取的字符是否为0,等于0结束,不等于0显示当前字符
mov ah,[si]
mov es:[bx],ah ;设置显示的字符
mov es:[bx+1],al ;设置显示的颜色
inc si ;读取下一个字符
add bx,2 ;指向下一个字符显示的位置
jmp short show_str_s
show_str_ok: pop di
pop es
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:进行不会产生溢出的出发运算,被除数为dword型,除数为word型,结果为dword
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
divdw: push bx
mov bx,ax ;bx=L
mov ax,dx ;ax=H
mov dx,0 ;dx=0作为高16位
div cx
push ax ;int(H/N)*65536入栈
mov ax,bx ;ax=L
;dx 余数作为高16位
div cx
mov cx,dx ;余数
pop dx ;结果的高16位
pop bx
ret
codesg ends
end start