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

我的博客

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

[2012-05-02 19:37] 课程设计1(续)

dtoc:                   ;定义子程序
;名称:dtoc
;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位;
;      (dx)=dword型数据的高16位;
;      ds:si指向字符串首地址。
;返回:无。
        push ax
        push bx
        push cx
        push dx
        push si          ;以上皆为存储主程序中各寄存器的值

        mov bx,0         ;将bx置零,用于存储位数

change: mov cx,10d       ;设置除数
        push bx          ;存储程序中bx的值
        push ax          ;存储低16位dword型数据
        mov ax,dx        ;将dx高16位数据放入ax
        mov dx,0         ;将dx置零
        div cx           ;计算高16位除法, 结果:ax存放高位商,dx存放余数
        mov bx,ax        ;存储高16位除法的商
        pop ax           ;还原低16位数据
        div cx           ;计算(余数+低16位)除法 结果:ax存放低16位商,dx存放余数
        mov cx,dx        ;将余数放入cx
        mov dx,bx        ;将高16位放入dx
        pop bx           ;还原程序中bx的值
        
        add cx,30h       ;转换
        push cx          ;将转换的值存储在栈中
        inc bx           ;位数增一
  
  mov cx,ax        ;将低位商存储在cx中,给jcxz指令判断商值提供条件
        jcxz s0          ;判断低位商值,若为零跳转到s0标号处
        jmp change       ;转移到change段,进行下一个余数的计算
  
s0:     mov cx,dx        ;将高位商存储在cx中,给jcxz指令判断商值提供条件
        jcxz deliver     ;当低位商和高位商都为零时,将转入deliver段
  jmp change       ;当高位商不为0时,返回到change段,继续取余
  
deliver:mov cx,bx        ;将位数送入cx中,为loop指令提供循环计数。
s:      pop dx           ;取出字符
        mov [si],dl      ;将字符送入数据段
  inc si           ;指向下一单元
        loop s           ;当cx为0时,停止循环
  mov byte ptr [si],0 ;设置结尾符0

        pop si
        pop dx
        pop cx
        pop bx
        pop ax           ;以上皆为恢复主程序中各寄存器的值
ret                      ;定义结束

show_str:                ;定义子程序
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
;返回:无
        push cx
  push es
  push dx
        push si
        push di          ;以上皆为保存主程序各寄存器的值
        mov ax,0b800h
        mov es,ax        ;设置显存段地址

        dec dh           ;行号在显存中,从0开始,所以减1
        mov al,0a0h      ;每行字节数     
        mul dh           ;计算行
        push ax          ;保存计算结果

        mov al,2         ;一个字符有两个字节
        mul dl           ;计算列
        sub ax,2         ;列号在显存中从0开始标号,又因为字符存在偶数中,所以减2

        pop di           ;将行的计算结果送入di中
        add di,ax        ;首字符,行列结果存在寻址寄存器中
        mov al,cl        ;将字符属性存放到al中,

show:   mov cl,[si]      ;将字符存放在cl中
        mov ch,0         ;为jcxz判断字符提供条件
        jcxz ok          ;判断0
        mov ch,al        ;将字符属性放到ch中
        mov es:[di],cx   ;将字符和字符属性送到所指显存中
        inc si
        add di,2
        jmp short show   ;循环到show

ok:     pop di
        pop si
  pop dx
  pop es
        pop cx           ;以上皆还原各寄存器数据
ret                      ;定义结束

code ends
end start
评论次数(3)  |  浏览次数(189)  |  类型(汇编作业) |  收藏此文  | 

[  fpamc   发表于  2012-05-02 19:38  ]

手机上传。可能有些乱……

[  tomato   发表于  2012-05-02 20:48  ]

除法子程序可以从dtoc子程序中抽离出来。这个课程设计,需要三个子程序,一个是除法溢出子程序,一个是dtoc子程序,一个是显示子程序,然后是主程序。

[  fpamc   发表于  2012-05-02 21:15  ]

恩,感觉合并之后更简洁(心理作用哈,)

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