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

类似文章