. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  大家帮我看看我实在是找不到原因了,为什么结果不是12666??  [待解决] 回复[ 5次 ]   点击[ 468次 ]  
thedaydreamwang
[帖 主]   [ 发表时间:2010-02-02 05:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
assume cs:code 
      data segment 
              db 10 dup(0) 
      data ends 
     code segment 
             start: mov bx,data
                     mov ax,12666
                     mov ds,bx 
                     mov ss,bx 
                      mov sp,0 
                       call dtoc 
                        mov dh,8 
                         mov dl,3 
                         mov cl,2 
                         call show_str 
                          mov ax,4c00h 
                          int 21h 
dtoc: push di
        push si
        push bx
        push cx
a:      mov cx,dx
        jcxz goon   ;判断dx高位是否为0
        mov cx,0ah
        call div_str
        push cx
        inc si
        jmp short a
goon:mov cx,ax
         jcxz  re_num
         mov cx,0ah
         call div_str
         push cx
         inc si
         jmp short goon
re_num: mov cx,si
s:           pop ax
             mov bx,30h
             add  ax,bx
             mov ds:[di],ax
             inc di
             loop s
             pop cx
             pop bx
             pop si
             pop di
             ret
div_str:push bx
          push ax 
          mov ax,dx 
          div cl 
          mov bx,ax 
          mov ah,0 
          mov dx,ax 
          pop ax 
          push dx
          mov dx,bx 
          mov dl,dh
          mov dh,0 
          div cx 
          mov cx,dx 
          pop dx
          pop bx
          ret
show_str:     push di
                  push si
                  push bx 
                  push es                  ;注意ss:sp指向长度
                  dec dh                   ;送入变量dh行号,dl为排号注意寄存器的使用cl为颜色
                   dec dl   
                   mov ax,0
                   mov al,dh   
                   mov bx,0   
                    mov bl,10   
                    mul bl
                    mov bx,ax
                    mov ax,0b800h
                    add ax,bx
                    mov es,ax
                    mov ax,0
                    mov  al,dl   
                    add al,dl   
                    mov bx,ax   
                    mov di,0   
                    mov  ch,cl    
       ok:        mov cl,[si]   
                    push cx   
                    mov ch,0   
                    jcxz return   
                    pop cx  
                    mov es:[bx+di],cx  
                    add di,2   
                    inc si   
                    jmp short ok   
       return:   pop cx
                    pop es
                    pop bx
                    pop si
                    pop di
                    ret
code ends
         end start
mess
[第1楼]   [ 回复时间:2010-02-03 10:48 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
用debug调试很奇怪,运行正常。但是直接运行exe显示错误。

单独测试show_str,能正常显示字符串,锁定错误出现在dtoc子程序。

dtoc: push di 
        push si 
        push bx 
        push cx 
a:      mov cx,dx  ---问题1:传入dtoc的dx值的含义是什么,程序并没有对dx设置,只能依靠系统(debug下查看都是0)。
        jcxz goon   
        mov cx,0ah 
        call div_str 
        push cx 
        inc si    ---问题2:传入dtoc的si值的含义是什么,程序并没有对si设置,也只能依靠系统。
        jmp short a 
------------------
在标号a前增加        mov si,0 和mov dx,0,程序能正常显示了。

dtoc这个子程序楼主应该在重新想想实现方法。
thedaydreamwang
[第2楼]   [ 回复时间:2010-02-03 22:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
回楼上的其实我也debug很多次了!!都没有找到原因,在整个程序的最后也就是在mov ax,4c00 int 21h之前debug -q 时已经能返回1266了只是当执行这两条语句之后就出现问题了,我在想是不是真的是哪里出问题了,好矛盾呢!!对与inc si的问题,si是一个计数器用下存储call div_str的反回值cx,因为12666除以0ah之后余数被返回到了CX中我当然要把它储存起来啊,因为12666中的尾数6会被先存储起来所以要用计数器si来数12666有几位,然后再进行pop程序是先进行push cx 5次然后再pop ax5次释放栈空间,这样设计应该是没有问题的,在debug过程中应该可以看得到,我的原理就是子程序用的空间要释放出来
thedaydreamwang
[第3楼]   [ 回复时间:2010-02-03 23:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
mov cx,dx的意思是先判断被除数是否为0因为被数有可能是0f0000h这种情况,所要来再这里先加一个判断,之后再进行cx的判断值到被除数为0,没有判断的时候遇到这种特殊的数字进行处理的时候就会产生问题,我也是看了书上的提示之后想到的!!
thedaydreamwang
[第4楼]   [ 回复时间:2010-02-04 00:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
忘了谢谢楼主了,要是没有楼主的好心帮助我还直找不出来问题的原因,只是有一点我不是很理解si和di默认情况下下不是0吗?感觉怪怪的,可能是自已还没有完全理解计算机的工作过程吧,以后注意子程序的调用吧,一定要先声明,不能想当然,必意CPU没那么陪明它并不能判断si和di在初始情况下就是0
thedaydreamwang
[第5楼]   [ 回复时间:2010-02-04 00:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
还有一点对mess的解说很到位有思路有点评大家磁到类似的问题可以参考一下真的很有用,高手!!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved