. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  心地善良的请进,实验10.3.它一直在折磨我啊!!!!!!!!!  [待解决] 回复[ 3次 ]   点击[ 403次 ]  
wsay666
[帖 主]   [ 发表时间:2009-07-26 23:08 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
实验10.3,我花了三天时间,还是卡在这里,有几次想放弃它,都忍住了,朋友们,发扬一下友爱精神吧!看一看,错在哪里?两个子程序单独都运行正常,放在一起就什么也不显示了!!!!!!代码如下:
assume cs:code
data segment
        db 10 dup(0)
        data ends
stack segment
        db 32 dup(0)
        stack ends        
code segment
        start: mov ax,12666
        mov bx,data
        mov ds,bx
        mov bx,stack
        mov ss,bx
        mov sp,32
        mov si,0
        call dtoc
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str
        mov ax,4c00h
        int 21h
        dtoc: push ax
        push si         ;PUSH两次SI的目的是,使下面的JCXZ循环条件成立.
        push si         ;这里取的是SI为0000,也可使用别的寄存器
        
        
dtoc1:         mov bx,10     ;用32位除法.
    mov dx,0
        div bx
        add dx,30h
        push dx            ;第一个字0036H入栈.
        mov cx,ax          ;商送CX
        jcxz ok1
        jmp short dtoc1
ok1: pop [si]      ;将栈中的字送入DS:SI
        mov cx,[si]        ;DS:SI送CX,以成为循环条件,直到把原SI内容弹出
        add si,2
        jcxz ok2
        jmp short ok1
ok2: pop ax
pop si
ret
show_str: push ax   ; 寄存器入栈。
push dx
push si
mov di,0            ;ES段初始
mov bx,0            
mov ax,0b800h
mov es,ax
mov al,160          ;至8行
mul dh
mov bx,ax           ;送入BX
mov dh,0
add bx,dx           ;至3列
add bx,dx
s:push cx           ;存CL值
mov ch,0
mov cx,ds:[si]      ;判断是否为0
jcxz ok
pop cx             ;弹出,以用到CL值即02H
mov ax,ds:[si]     ;AX作为中转
mov ah,cl          ;颜色属性送高位
mov es:[bx+di],ax  ;第一字母及属性送8行3列
    
add si,2
add di,2
jmp short s
ok:pop cx         ;jcxz过来后,莫忘POP CX
pop si
pop dx
pop ax
ret
code ends 
end start
younggay
[第1楼]   [ 回复时间:2009-07-27 10:32 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
那你先自己确定到底是那个子程序的问题。
要一个个的功能测试,要充分利用debug下的T等命令来观察程序的运行过程。
younggay
[第2楼]   [ 回复时间:2009-07-27 10:46 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
程序的问题出在你的si上。
在你dtoc子程序中,你将si从0开始,放到了ds中,通过debug跟踪后,dtoc运行后,data段中的数据是正确的,说明错误没在dtoc程序中。

在showstr中,你是将ds:0处的数据显示出来,你在定位的时候是ds:si来寻址的,但是,dtoc之后,你的si是pop回复后的,并不是si=0,这样,在显示的时候,你定位数据的地址就出问题了,你现实的就不是data段中你处理好的数据。

这些问题对于学习到这里的你来说,应该能够比较快的定位和解决了,感觉楼主还是有点逻辑不够清晰,debug要配合思维逻辑灵活使用。希望我的这些处理过程能对你有所帮助。
wsay666
[第3楼]   [ 回复时间:2009-07-27 17:57 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
领教了,很惭愧.
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved