. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验2 DEBUG无错 直接运行有错 暂未将字符串逆序  [已解决] 回复[ 6次 ]   点击[ 518次 ]  
zhllhz
[帖 主]   [ 发表时间:2009-12-28 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
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
        call dtoc

        mov dh,8
        mov dl,3
        mov cl,2
        mov si,0
        mov bx,0
        call show_str
        mov ax,4c00h
        int 21h
dtoc:   push dx
                push cx
                push bx
                push ax
        call divdw
    
                pop ax
                pop bx
                pop cx
                pop dx
                ret       
divdw:  push ax
        mov ax,dx
        mov dx,0
                mov cx,0ah
        div cx     ;ax放高位的商,dx放高位的余数
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
                
        add cl,30h
        mov [si],cl
                inc si
        mov cx,ax
        jcxz ok1
                jmp short divdw
ok1:        mov byte ptr [si],0
        ret

show_str:
                push ax
                push bx
                push cx
                push dx
        mov ax,0b800h
        mov es,ax
        mov al,dh
        mov ah,0
        mov bl,160
        mul bl
        add dl,dl
        mov bl,dl
        mov bh,0
        add ax,bx
        mov bx,ax
        mov al,cl
s:      mov cl,[si]
        mov ch,0
        jcxz over
        mov es:[bx],cl
        mov es:[bx+1],al
        inc si
        add bx,2
        jmp short s
over:   pop dx
                pop cx
                pop bx
                pop ax
          ret
code ends
end start
release_lag
[第1楼]   [ 回复时间:2009-12-29 14:42 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2009-10-27 16:12
我看了一会楼主的程序,你在调用dtoc之后,得到的余数本来就是逆向的,
调用dtoc之后,data段中的数据应该是这样的

ds:0 36h,36h,36h,32h,31h,0,0,0,0,0,0,0,0,0,0,0
要得到正确结果,楼主应该在dtoc子程序中,把余数逆向
zhllhz
[第2楼]   [ 回复时间:2009-12-29 19:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
回复:[第1楼]
------------------
没做注释 呵呵
那个逆序输出的子函数我写出来了

原来遇到的问题有过COMMAND无错而DEBUG 有错

我现在这个程序的问题是
用COMMAND加载运行有错误
而DEBUG 加载运行无错

不知道问题出在哪里

运行一下试试
yiyn
[第3楼]   [ 回复时间:2009-12-29 19:49 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:0
注册日期:2009-10-18 04:41
天啊,老兄,你这也在复杂了,想问题不用那么复杂,你这没有逆序的就搞得这么多,要是逆一下怎么办?
\你即然是用DX,来保存的余数,其实不用把他分成DL来做的,因为你直接在DX加上30h后相当于DL加上了30h,(当然dl是8位他的范围是255要是加上30超过这个值这样做就不行了,)给你个思路

除法还是那样做,做出来后dx保存,然后dx加上30h入栈/或是存到一段数据段里面
如果栈 除完后直接跳出去出栈就反过来了,
zhllhz
[第4楼]   [ 回复时间:2009-12-29 20:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
回复:[第3楼]
------------------
受教了 
余下的问题和2楼的问题一样
zhllhz
[第5楼]   [ 回复时间:2009-12-30 09:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
谢谢大家关注 
问题找到了
调用dtoc之前,只给ax赋了值
而没有给DX赋值为0
zhllhz
[第6楼]   [ 回复时间:2009-12-30 09:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
此贴由 贴主 于 [ 2009-12-30 09:55 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(release_lag):3分   3楼(yiyn):1分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved