. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
主题 : :  大家帮我看看我实在是找不到原因了,为什么结果不是12666??  [待解决] 回复[ 5次 ]   点击[ 474次 ]  
thedaydreamwang
[帖 主] [ 发表时间:2010-02-02 05:49 ] 
荣誉值: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
thedaydreamwang
[第2楼] [ 回复时间:2010-02-03 22:59 ] 
荣誉值: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过程中应该可以看得到,我的原理就是子程序用的空间要释放出来
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved