汇编网首页登录博客注册
towersimper的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言

[2010-07-27 10:02] 第十章实验十:编写子程序之一数值显示

图片载入中
第十章实验十:编写子程序之一数值显示
assume cs:code,ds:data,ss:stack
data segment
     db 10 dup (0)
data ends
stack segment
    dw 32 dup (0)
stack ends
code segment
start: mov ax,12666         ;存储需要显示的整数
        mov bx,data           
        mov ds,bx           ;将整数转换为字符串后所存储的存储单元的数据段段地址
        mov bx,stack
        mov ss,bx 
        mov sp,40h          ;以上三条指令设置栈段和空栈
        mov si,0
        call dtoc           ;调用将整数化为字符串的子程序
        mov dh,8            ;以下程序及show_str子程序的注释见编写子程序之一字符串显示,里面有详细介绍,这里不作多解释
        mov dl,3
        mov cl,02h
        call show_str
        mov ax,4c00h
        int 21h
dtoc:    push ax            ;将与外程序重叠的ax入栈保护
         push si            ;将与外程序重叠的si入栈保护
         mov di,0
   s0:   mov dx,0
         mov cx, 0Ah
         div cx             ;32为被除数,其中低16位在ax中,高16为在dx中,相除后,商在ax中,余数在dx(余数是在0~9)中
         mov cx,ax          ;将商传给cx以便jcxz判断商是否为0
         add dx,30h         ;将余数转换为数字的ascii码
         push dx            ;将转换后的ascii字符入栈,由于余数在[0~9],可知(dh)为0,即(dx)=(dl)        
         inc si             ;将入栈的数字ascii码个数记录下来,即统计待显示十进制数总共有多少位
        jcxz s1             ;如果商为0,跳出s0循环,如果不为0,将继续循环,下次循环,被除数为上次循环的商。
     jmp short s0            
s1: mov cx,si               ;将统计的十进制数位数传给cx,表示出栈的次数
s2: pop dx                  ;将之前入栈的ascii码按照与入栈相反数序出栈
     mov ds:[di],dl         ;将每次出栈的ascii码存储到数据段中
     inc di                 ;出栈循环,每循环一次,di加1
loop s2
     pop si                 ;将被的保护si出栈
     pop ax                 ;将被的保护ax出栈
     ret                    ;返回调用dtoc子程序的主程序处

show_str:
       push ax
       push dx
       push cx
       push si
       mov bx,0B800h
        mov es,bx
        mov al,0A0h
        mul dh
        mov bx,ax
        mov ah,0
        mov al,dl
        add bx,ax
        mov di,0
        mov ch,0
        mov al,cl
     s3: mov cl,ds:[si]
        jcxz ok
        mov es:[bx+di+1],cl
        mov es:[bx+di+2],al
        inc si
        add di,2
loop s3
ok: pop si
      pop cx
      pop dx
      pop ax
      ret
code ends
end start
评论次数(3)  |  浏览次数(715)  |  类型(汇编作业) |  收藏此文  | 

[  masmaster   发表于  2010-07-27 14:51  ]

找个32位大数测试了吗?例如:ffffffffh

[  towersimper   发表于  2010-07-27 15:07  ]

呵呵。我当然知道此处程序只能处理65536以下的整数啊。只是姑且按照书上说的那样啊。在第十章设计点中要把实验七的数据显示时,要涉及到一些用16位寄存器ax不能存储的dd型数据,当然要改一下程序了。老兄莫急啊。还在继续做题目啊。

[  masmaster   发表于  2010-07-27 16:16  ]

嘿嘿~~↖(^ω^)↗

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码