代码改变世界

实验10.3_数值显示

2014-04-18 21:01  星星之火✨🔥  阅读(178)  评论(0)    收藏  举报
;子程序描述
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符。
;参数:(ax)= word型数据
;        ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
;在显示时我们调用本次实验中的第一个子程序show_str
;----------思路:-------------------------------------------
;已知:数据在ax中,要求转化为字符存储在ds:si中
;步骤:ax循环做除法,余数+30h入栈,直至商零,个数的记录用di
;出栈到ds:si中以零作尾。
;----------END 思路----------------------------------------
assume cs:code 
data segment 
  db 10 dup (0) 
data ends 
code segment 
start:  mov ax,12666 
        mov bx,data 
        mov ds,bx 
        mov si,0 
        call dtoc 
         
        mov dh,8 
        mov dl,3 
        mov cl,2 
        call show_str 
         
        mov ax,4c00h 
        int 21h 
         
dtoc:   push ax;子程序中使用的寄存器入栈 
        push bx 
        push cx 
        push dx 
        push di 
        push si 
         
        mov di,0;计数器,记录余数的个数 
        mov bx,10;除数 
        mov dx,0 
    s1: div bx 
        inc di 
        add dx,30H;余数+30H转化为ASCII码 
        push dx 
        mov cx,ax 
        jcxz yes;商为零则跳转到yes 
        mov dx,0;dx置零,为下次除法做准备 
        jmp short s1 
                 
  yes:  mov cx,di 
    p:  pop ds:[si] 
        inc si 
        loop p 
        ;由于show_str的需要,ds:di处的字符串以零作尾。 
        ;mov byte ptr ds:[si],0这条语句有无皆可,因为最后一次入栈的时候高8位 
;一定是零 
         
        pop si;子程序中使用的寄存器出栈 
        pop di 
        pop dx 
        pop cx 
        pop bx 
        pop ax 
        ret 
show_str: 
        push ax;子程序中使用的寄存器入栈 
        push cx 
        push dx 
        push ds 
        push es 
        push si 
        push di 
         
        mov al,160;计算行号和列号对应的显存地址 
        mov ah,0;不要忽略了 
        dec dh 
        mul dh 
        dec dl 
        add dl,dl 
        mov dh,0;不要忽略了 
        add ax,dx 
        mov di,ax 
         
        mov dl,cl;由于下面的jcxz指令要用到cx,所以用dl保存cl的值 
         
        mov ax,0b800h 
        mov es,ax 
   s:   mov al,ds:[si] 
        mov cl,al 
        mov ch,0 
        jcxz ok 
        mov es:[di],al 
        mov es:[di+1],dl;颜色属性被保存在dl中 
        inc si 
        add di,2 
        jmp short s 
   ok:  pop di;子程序中使用的寄存器出栈 
        pop si 
        pop es 
        pop ds 
        pop dx 
        pop cx 
        pop ax 
  
        ret 
code ends 
end start