. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3_请纠错!急!  [已解决] 回复[ 3次 ]   点击[ 472次 ]  
fxl
[帖 主]   [ 发表时间:2010-03-04 22:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-27 17:13
这是我写的程序,结果怎么也不出来,调试也没有出错,希望大家帮我看看哪里出问题了。

assume cs:code,ds:data
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 si,0
mov dh,8
mov dl,3
mov cl,2
call show_str

mov ax,4c00h
int 21h

dtoc:
push bx
push ax
push cx
push dx
push si

K:mov cx,ax;将ax的值赋给cx,最终来判断ax时候为零
jcxz s0;若为零则跳到s0
mov dx,0
mov cx,10
div cx;让ax除以10,余数放在dx中,商放在ax中
add dx,30h;ascii码变换
push dx;保存dx值
inc bx;bx最终用来确定循环次数
jmp short K

s0:
mov cx,bx;经过计算,bx等于5
mov si,0
s1:pop ax
mov [si],al
inc si
loop s1

okey:pop si
pop dx
pop cx
pop ax
pop bx
ret


show_str:  
        push bx;这个show_str子程序是没有错误的

        push cx

        push si

        mov al,0A0h

        dec dh

        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2

        add bx,ax

        mov ax,0B800h

        mov es,ax

        mov di,0

        mov al,cl

        mov ch,0

s:      mov cl,ds:[si]

        jcxz ok

        mov es:[bx+di],cl

        mov es:[bx+di+1],al

        inc si

        add di,2

        jmp short s

ok:     pop si

        pop cx

        pop bx

        ret

 

code ends

end start
fxl
[第1楼]   [ 回复时间:2010-03-04 23:16 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-27 17:13
自己又重新调试了一遍,发现这次才叫调试,一步一步的执行程序,并分析每步之后的程序,这次终于出来结果了
修改之后,正确程序如下
assume cs:code,ds:data
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,0
call dtoc

mov si,0
mov dh,8
mov dl,3
mov cl,2
call show_str

mov ax,4c00h
int 21h

dtoc:
push bx
push ax
push cx
push dx
push si

K:mov cx,ax;跳到这里而非原来的dtoc,如果直接跳到dtoc则push dx一点用都没有
jcxz s0
mov dx,0
mov cx,10
div cx
add dx,30h
push dx
inc bx
jmp K

s0:
mov cx,bx
mov si,0

s1:pop ax
mov [si],al
inc si
loop s1

okey:pop si
pop dx
pop cx
pop ax
pop bx
ret

show_str:  
        push bx

        push cx

        push si

        mov al,0A0h

        dec dh

        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2

        add bx,ax

        mov ax,0B800h

        mov es,ax

        mov di,0

        mov al,cl

        mov ch,0

s:      mov cl,ds:[si]

        jcxz ok

        mov es:[bx+di],cl

        mov es:[bx+di+1],al

        inc si

        add di,2

        jmp short s

ok:     pop si

        pop cx

        pop bx

        ret

 

code ends

end start
langzi82561
[第2楼]   [ 回复时间:2010-03-14 00:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-18 19:15
一步一步调试很累人的,特别是大一点的程序,现在我一般是直接分析程序
fxl
[第3楼]   [ 回复时间:2010-03-17 15:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-27 17:13
此贴由 贴主 于 [ 2010-03-17 15:12 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved