. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3,debug调试后可以显示,但有问题  [待解决] 回复[ 16次 ]   点击[ 620次 ]  
grc10010010
[帖 主]   [ 发表时间:2011-12-06 08:52 ]   [引用]   [回复]   [ top ] 
荣誉值: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
[第1楼]   [ 回复时间:2011-12-06 19:25 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
程序可能是正确的,之所以显示不对,可能是满屏了,滚屏了,然后向上滚了两行。
tomato
[第2楼]   [ 回复时间:2011-12-06 19:26 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主可以试一下,不让屏幕满屏,应该就显示正确了。
tomato
[第3楼]   [ 回复时间:2011-12-06 19:26 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
清一下屏再运行程序。
grc10010010
[第4楼]   [ 回复时间:2011-12-07 08:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
嗯,是这样的,屏幕不满屏时就用g命令运行到程序结尾就可以按要求显示了。谢谢指点。
wlzaini1314
[第5楼]   [ 回复时间:2011-12-07 18:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-15 22:31
12666除法能益处 不能把 字单元能纯65535呢
grc10010010
[第6楼]   [ 回复时间:2011-12-09 13:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
;注:求余运算子程序有问题,因为循环结束的条件是商为零,而不是余数为零,该程序显示没
;有出问题是因为显示的数据中没有零,否则将会出错,正确答案请参照本人写的课程设计一的作业.
javaimgod
[第7楼]   [ 回复时间:2012-01-31 02:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
程序难懂为什么用了2次div?
没看懂
javaimgod
[第8楼]   [ 回复时间:2012-01-31 02:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
我的求余运算子程序:         
dtoc:     

          mov dx,0   ;高位补0进行32位除法运算!
          mov bx,10
          div bx     ;求余
          add dx,30h ;余转字符
          mov cx,ax   ;商判断0
          mov di,0
          inc di  ;计数
          push dx  ;字符压栈
          jcxz ok
          jmp short toc
          
    ok:   mov cx,di   
    ok1:  pop [si]   ;出栈到data
          inc si
          
          loop ok1
         
          ret
javaimgod
[第9楼]   [ 回复时间:2012-01-31 03:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
mov di,0应该是外面的写错了
jmp short dtoc写成toc了
tomato
[第10楼]   [ 回复时间:2012-01-31 10:13 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
mov di,0改一下应该就没问题了。还是要在计算机上验证一下。
lanxujian
[第11楼]   [ 回复时间:2012-03-13 17:10 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2012-02-16 19:46
先将字符压栈,若果要处理的字符串很多,几千几万个,怎么办??那栈还能放得下吗???
tomato
[第12楼]   [ 回复时间:2012-03-13 23:27 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
回复11楼:如果字符很多可以使用数据段来存储。
jeremy
[第13楼]   [ 回复时间:2012-06-29 20:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-03-09 19:30
回复:[第12楼]
------------------
压栈和出栈都是字操作,可是存放到数据段中的应该是字节啊?
jeremy
[第14楼]   [ 回复时间:2012-06-29 20:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-03-09 19:30
显示字符串子程序是显示的字节,楼主这里通过出栈,存储在data段中的是字,这个怎么回事?
wwt406
[第15楼]   [ 回复时间:2012-07-27 12:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2012-04-23 22:44
assume cs:code
data segment
    db 10 dup (0)
data ends
code segment
start:    mov ax,1226
        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 cx
      push bx
          push di
          push dx
          push si
          push ax       ;要用到的寄存器进栈
          
          mov cx,5
          mov bx,10
          mov ax,12666
          mov si,4
s:          mov dx,0
          div bx
          add dl,30h
          mov ds:[si],dl
          dec si
          loop s     ;以上操作避免溢出转换为32位进行除法运算,并把结果转换为ASC码,为输出显示做准备
          
          
          pop ax
          pop si
          pop dx
          pop di
          pop bx
          pop cx ;用到的寄存器出栈,注意顺序
          ret

show_str:  push ax
           push cx
                   push dx
                   push bx
                   push si
                   
           mov al,0a0h
           mul dh
                   mov dh,0
                   add dl,dl
                   add ax,dx
                   mov bx,ax
                   mov ax,0b800h
                   mov es,ax    ;计算并设定行与列的起始位置
                   
wt:                   push cx
                   mov cl,ds:[si]
           mov es:[bx],cl
                   mov ch,0
                   jcxz ok
                   pop cx
                   mov es:[bx].1,cl
                   inc si
                   add bx,2
                   jmp wt                   ;输出显示
                   
                   
ok:      pop cx
                 pop si
                 pop bx
                 pop dx
                 pop cx
                 pop ax           ;出栈
             ret
                   
                   
                   
                   
code ends
end start
          
          
          这是我写出来的,希望大家指点下
wwt406
[第16楼]   [ 回复时间:2012-07-27 13:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2012-04-23 22:44
转换为字符串显示,除以10,所以余数不可能超过10,我就直接用DL,30H了
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved