. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3  [待解决] 回复[ 6次 ]   点击[ 1445次 ]  
xiaosong
[帖 主]   [ 发表时间:2009-03-11 21:39 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2009-03-05 20:41
谁能提点意见  帮我看看  运行后结果显示框一闪而过  怎么回事??show_str子程序前面已经用过了 没问题  可能就是dtoc子程序有问题 但自己找了好久 没找出来 自己的错误自己可能难找  但旁观者清。
assume cs:code,ss:satck,ds:data 
data segment 
    db 10 (0) 
data ends 
satck segment 
    dw 16 (0) 
satck ends 

code segment 
start:  mov ax,12666 
        mov bx,data 
        mov ds,bx 
        mov si,0 
        mov bx,satck 
        mov ss,bx 
        mov sp,32 
        call dtoc 
        mov dh,8 
        mov dl,3 
        mov cl,2 
        call show_str 
        mov ax,4c00h 
        int 21h 
        
 dtoc:push dx
      push ax
      push bx
      push cx
      push si
      mov cx,0
   s1: mov dx,0
      mov bx,0ah
      div bx
      push dx
      inc cx
      mov bx,cx
      mov cx,ax
      jcxz ok1
      mov cx,bx
      jmp s1
      
      ok1:inc cx
         pop [si]
         inc si
         loop ok1
         pop si
         pop cx
         pop bx
         pop ax
         pop dx
         ret
         
         
show_str:push ax
       push dx 
       push bx 
       push si 
       push cx 
       mov ax,0b800h 
       mov es,ax 
       mov al,160 
       mul dh 
       add dl,dl 
       mov dh,0 
       add ax,dx 
       mov bx,ax 
       mov al,cl 
        
     
     s:mov cl,[si] 
       mov ch,0 
       jcxz ok 
       mov es:[bx],cl 
       mov byte ptr es:[bx+1],al 
       inc si 
       add bx,2 
       jmp short s 
        
     ok:pop cx 
        pop si 
        pop bx 
        pop dx 
        pop ax
        ret 
code ends 
end start
abob
[第1楼]   [ 回复时间:2009-03-12 18:29 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
show_str子程序前面已经用过了 没问题  可能就是dtoc子程序有问题 但自己找了好久 没找出来 自己的错误自己可能难找  但旁观者清。 
------------------
如果把show_str注释了,还出现错误,就说明不是show_str的问题。“前面已经用过了 没问题”这未必准确,可能是你已经用的时候没有除法程序的错误。
执行完dtoc后肯定会把结果存好让show_str去调用的,debug跟踪查下就知道dtoc是否正确了。
据我的经历,“旁观者清”在学习计算机不太使用,试想你写了N行的代码,让旁观者给你找出错误?!!感叹一下旁观着怎么去“旁观者清”吧~  对于程序的逻辑错误倒是可以讨论一下。

谁能提点意见  帮我看看  运行后结果显示框一闪而过  怎么回事??
--------------------
楼主运行后能“结果显示框一闪而过”,我运行怎么直接就死循环了呢?

dtoc子程序起码需要实现:1.除法,得到余数 2,将得到的余数,也就是拆分之后的整数存入相应位置

-d ss:0 1f
0B66:0000  00 00 00 00 3F 00 67 0B-66 05 01 00 02 00 06 00   ....?.g.f.......
0B66:0010  06 00 06 00 00 00 9B 00-66 0B 7A 31 00 00 16 00   ........f.z1....
这是执行第一部分得到的“栈中的结果”,可以看到这部分是正确的。

而到了第二部分就出现问题了:如果楼主自己debug就会发现了,只执行了一次pop,紧接着就ret,不过后面的指令就不知道是什么了,显然不是楼主程序里面的。原因:call压入的数据,没有在ret中正确读出来。

问题已经找到了,解决方法楼主自己想想吧,如果前面是按照书上的要求自己学下来的话,分析到这里程序已经很容易调试正确了。

如果程序出错,不能一眼就看出逻辑错误的话,debug慢慢跟踪、分析是必经的方法,谁都是一样。对于学到好的人只是第一步“一眼看出错误”做的好,第二步debug更加熟练而已了。
xiaosong
[第2楼]   [ 回复时间:2009-03-12 22:07 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2009-03-05 20:41
我找到错误了。这一段
 jcxz ok1 
      mov cx,bx 
      jmp s1 
       
      ok1:inc cx 
         pop [si] 改为
jcxz ok2
      mov cx,bx
      jmp s1
      
   ok2:  mov cx,bx
   ok1:  pop [si]
         inc si  就好了,前面用来计数的CX 因为mov cx,bx 被前面的jcxz ok1 跳过而没有执行,所以执行下面时CX=0了 下面的循环也就不能执行了,出栈就混乱了。   而且后面我还忘了将取出来的数加上30H,太粗心大意了。  谢谢abob了 听了你上面的一席话  受益匪浅,花了一个晚上DEGUG终于将问题找出来了。也提高了我用DEGUG差错的能力。。呵呵
sinawear
[第3楼]   [ 回复时间:2009-05-25 08:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
这样也精华》》》》》》》》》?
zwjq
[第4楼]   [ 回复时间:2010-08-26 10:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2010-07-31 15:39
我做的部分修改
assume cs:code,ss:satck,ds:data  
data segment  
    db 10 (0)  
data ends  
satck segment  
    dw 16 (0)  
satck ends  

code segment  
start:  mov ax,12666  
        mov bx,data  
        mov ds,bx  
        mov si,0  
        mov bx,satck  
        mov ss,bx  
        mov sp,32  
        call dtoc  
        mov dh,8  
        mov dl,3  
        mov cl,2  
        call show_str  
        mov ax,4c00h  
        int 21h  
         
 dtoc:push dx 
      push ax 
      push bx 
      push cx 
      push si 
      push di
      mov di,0       ;di用来记数
      mov cx,0       ;将cx清零,作为余数,判断结束
   s1: mov dx,0 
      mov bx,0ah 
      div bx 
      mov cx,dx
      jcxz ok1
      push dx 
      inc di   
      jmp s1 
       
      ok1:mov cx,di ;记录循环次数
      OK2:
         pop [si]
         add byte ptr [si],30h 
         inc si 
         loop ok2 
         pop di
         pop si 
         pop cx 
         pop bx 
         pop ax 
         pop dx 
         ret 
          
          
show_str:push ax 
       push dx  
       push bx  
       push si  
       push cx  
       mov ax,0b800h
chenhaoqian
[第5楼]   [ 回复时间:2011-01-19 19:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-15 15:20
好像是商在AX里不再dx所以应该是mov cx,ax 然后再jcxz ok1
bottom
[第6楼]   [ 回复时间:2022-01-24 22:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2022-01-04 14:28
hhah
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved