代码改变世界

实验10.3_数值显示拓展_dword型数转变为表示十进制数的字符串

2014-04-18 21:54  星星之火✨🔥  阅读(492)  评论(0编辑  收藏  举报
assume cs:code  
data segment 
db 10 dup (0) 
data ends 
code segment  
start : mov ax,4240H;F4240H=1000000 
        mov dx,0FH 
        mov cx,0AH 
        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;计数器,记录余数的个数 
    s1: mov cx,10;除数 
        call divdw 
        inc di 
        add cx,30H;余数+30H转化为ASCII码 
        push cx 
        cmp dx,0 
        jne s1 
        cmp ax,0 
        jne s1         
         
        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 
         
divdw:  push bx;要用到的寄存器bx、di入栈,下面用它来暂存参数的值 
        push di;不要将ax,dx,cx入栈,因为程序的目的最终是要修改它们的值 
        mov bx,ax 
        mov ax,dx 
        mov dx,0 
        div cx;这一步做完以后,ax中为结果的高十六位,即int(H/N),dx中是rem(H/N)的值 
        mov di,ax 
        mov ax,bx 
        div cx;这一步做完以后,ax中为结果的低16位,dx中存储余数 
        mov cx,dx 
        mov dx,di 
         
        pop di 
        pop bx 
        ret         
code ends 
end start


;子程序描述:
;名称:dtoc
;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)= dword型数据的低16位
;        (dx)= dword型数据的高16位
;        ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据1000000以十进制的形式在屏幕的8行3列,用绿色显示出来。
;在显示时我们调用本次实验中的第一个子程序show_str和第二个子程序divdw
;思路类似实验10.3_数值显示

;总结:在实际编程中,程序的模块化是必不可少的。因为现实的问题比较复杂,对现实
;问题进行分析时,把它转化成相互联系、不同层次的子问题,是必须的解决方法。利用
;call和ret指令,我们可以用简捷的方法,实现多个相互联系、功能独立的子程序来解
;决一个复杂的问题。
;----摘自汇编语言_模块化程序设计