. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
主题 : :  实验10.3,debug调试后可以显示,但有问题  [待解决] 回复[ 16次 ]   点击[ 636次 ]  
grc10010010
[帖 主] [ 发表时间:2011-12-06 08:52 ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
下面是实验10.3的作业,但在debug中调试时虽然可以显示,但显示位置不是定义的8行3列,而是6行3列,这是什么原因呢,大家帮我看看:
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符.
;参数:(ax)=word型数据
;     ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来.在显示时调

;用实验10.1的子程序show_str.

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
  mov di,0    ;这1句是增加的代码,书本中没有
  call dtoc

  mov dh,8
  mov dl,3
  mov cl,2
  call show_str

  mov ax,4c00h
  int 21h

;****************
;显示字符串子程序
;****************
 show_str:
  mov si,0
  mov ax,0B800h
  mov es,ax
  mov al,160
  mul dh
  mov bx,ax
  mov al,2
  mul dl
  mov di,ax    ;以上代码定位字符串的内存位置

  mov ch,0
 s:
  push cx    ;颜色信息入栈
  mov al,[si]
  mov es:[bx+di],al
  mov es:[bx+di+1],cl
  mov cl,[si]
  jcxz ok    ;如果未到达字符尾(cx不等于0),将字符写入指定内存,否则返回主程序结束
  inc si
  add di,2
  pop cx    ;恢复颜色信息
  jmp short s
  
 ok:
  add sp,2
  ret
;*************************************************
;求余运算并将余数转化为相应的ASCII码存放到data段中
;*************************************************
 dtoc:
  push ax   ;将被除数的低16位入栈
  mov ax,dx
  mov dx,0
  mov cx,10
  div cx    ;该指令执行后ax中存放的是int(H/N),dx中存放的是rem(H/N)
  mov bx,ax    ;因为后面要用到int(H/N),所以将它存放到bx中
  pop ax    ;该指令执行后dx,ax中存放的是T=[rem(H/N)*65536+L]的高16位和低16位
  div cx    ;该指令执行后dx中存放的是T/N的余数,ax中存放的是T/N的商(这个商正是结
;果的低位)
  mov cx,dx    ;余数按要求应放到cx中
  mov dx,bx    ;高位存放int(H/N)
  jcxz s0
  add cx,30h    ;将余数转化为字符
  push cx    ;将字符逆序压栈
  inc di    ;di存放字符的数量
  jmp short dtoc

 s0:
  mov cx,di
 s1:  
  pop [si]    ;将字符出栈到data段中
  inc si
  loop s1
  ret

code ends

end start
tomato
[第2楼] [ 回复时间:2011-12-06 19:26 ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主可以试一下,不让屏幕满屏,应该就显示正确了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved