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

来源:互联网 发布:怎么看淘宝的图片大小 编辑:程序博客网 时间:2024/06/05 02:29
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指令,我们可以用简捷的方法,实现多个相互联系、功能独立的子程序来解
;决一个复杂的问题。
;----摘自汇编语言_模块化程序设计

0 0