汇编网首页登录博客注册
rsice的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2008-04-08 23:08] 终于完成了实验10子程序3:显示字符串!真实不容易啊!

图片载入中
说说这个程序的情况,虽然完成了,但是又留给了我两个难题!
第一个是wdm指出的:“由于sp值过小,在debug下的T单步跟踪时候出错的情况”,我按照这个把堆栈扩大,果然我在上一篇文章中令我百思不得其解的问题表面上解决了,但是我不明白为什么sp=4的时候,用t单步就会错?明明堆栈还有2个字的空间啊?!
第二个是这个程序,我沿用原来现成的show_str子程序,无法正确显示字符串,但我认为应该是能行得通的,但我调试的时候,看到内存b850:0006处的变化真的很奇怪,我修改了一下,问题虽然解决,但是我也想不通为什么,我准备再研究研究,同学们也请帮帮我!我在下面的语句中,把我原来的语句作为注释放在边上一边大家比较。
assume cs:code,ds:data,ss:stack
data segment
   db 10 dup (0)
data ends

stack segment
   db 160 dup (0)
stack ends

code segment
start:  mov   bx,data
        mov   ds,bx
        mov   si,0
        mov   ax,stack
        mov   ss,ax
        mov   sp,160
        mov   ax,12666
        mov   dx,0
        call  dtoc
                      
        mov   dh,8
        mov   dl,3
        mov   cl,2                          
        call  show_str

                      
        mov   ax,4c00h
        int   21h
              
dtoc:   mov   bx,0  ;说实话,这是我挺得意的一个地方。
         push  bx
                          
        mov   bx,0ah
s1:     div   bx
        push  dx        ;dx存放余数,压栈备用
        mov   dx,0      ;dx清零,准备循环                  
        mov   cx,ax     ;ax是商放入cx以判断是否为0
        jcxz  transform        ;跳走开始处理
        jmp   s1
                                       
transform: pop   cx;依次从堆栈中出栈到cx,顺序应该是1,2,6,6,6,0
           mov   ch,0;   
           jcxz  ok       
           add   cl,30h   
           mov   [si],cl  
            add si,2     
           jmp   transform

ok:           ret            
              

show_str:     mov ch,0
              push cx    ;颜色参数入栈备用
              mov ax,0           
              mov al,dh
              mov bl,0ah
              mul bl
              mov bx,0b800h          
              add bx,ax
              mov es,bx   ;定位字符串起始行的位置,ax=8×10=80=50h,es=50h+b850h=b850h

              mov ax,0
              mov al,dl
              mov bh,0
              mov bl,2
              mul bl
              mov di,ax   ;定位字串起始列的位置:di初始值3×2=6  es:[di]=b850:0006是字符串的起始位置
     
                pop ax      ;ax放颜色参数
                mov si,0    ;上次的程序这里疏忽了,漏了这句,结果上个si=10没有清零。  
s2:           mov cx,ds:[si]  ;原来是mov cl,ds:[si]  
              jcxz over              
              mov es:[di],cx  ;原来是mov es:[di],cl     
              mov es:[di+1],al;      
              add si,2        ;原来是add si,2      
              add di,2        ;我觉得这两种写法不是完全一样的嘛,为什么一个行一个不行?
              jmp short s2
     
over:         ret                        

code ends
end start
评论次数(4)  |  浏览次数(873)  |  类型(汇编作业) |  收藏此文  | 

[  wdm   发表于  2008-04-09 14:34  ]

我不明白为什么sp=4的时候,用t单步就会错?明明堆栈还有2个字的空间啊?! 
--------------
T是一个中断显示例程,中断例程运行的时候,会用到当前的栈空间来存放cpu运行现场数据,所以,如果你的栈空间比较小,t中断的时候就放入的数据就会造成栈溢出了,那么操作系统就会将你的这行为给毙掉了。这个将在后面的中断章节详细介绍。

[  wdm   发表于  2008-04-09 14:41  ]

看到内存b850:0006处的变化真的很奇怪
=============
数据必然都是你些进入的,之所以有问题,肯定是你再定位数据和写输入的时候的寻址变化不一致或这混乱造成的。

[  wdm   发表于  2008-04-09 15:11  ]

mov es:[di],cx  ;原来是mov es:[di],cl      
mov es:[di+1],al;
这里是有认识问题的。
本来就应该是mov es:[di],cl,如果你是mov es:[di],cx 那么你存放的是一个字单元,你的ch会放在es:[di+1]处,虽然你后面有es:[di+1],al重新覆盖了此处的数据,但是,这种思维逻辑就是有隐患的。

[  taotling   发表于  2008-04-09 23:46  ]

你啊,肯定是太贪快,所以细节上的东西没注意。。。。
来晚了,报个到。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码