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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  CHERISH YOUR LIFE!
  • 『姓名』:云清                
  • 『性别』:保密  『发送消息
  • 个人说明:学问之美,在于使人一头雾水;诗歌之美,在于煽动男女出轨。
  • 详细信息『加为好友』
学习动态
好友圈
友情链接

[2008-08-19 08:29] 实验10.1-显示字符串

写出来了,调试也通过了,可是依然遇到两个问题:
问题1:程序用Debug调试可以正常显示,但CMD下去什么都不显示(好像一闪而过),而在commmand.com下运行也可以正常显示。请问这是怎么回事?(不知道其他人是否也如此?)
PS. 175页实验9的程序可以正常显示。
问题2:程序中定义了SS段: dw 16 dup (0),但当sp取值 1AH 到 20H 时候,程序运行就会出错,请问这是怎么回事? 

程序如下:
assume CS:CODESG, DS:DATASG, SS:STACKSG
STACKSG SEGMENT
    dw 16 dup (0)
STACKSG ENDS

DATASG SEGMENT
    db 'Welcome to Masm!', 0
DATASG ENDS

CODESG SEGMENT
    start:
        mov DH, 8        ;定义字符串显示位置:第8行
        mov DL, 3            ;定义字符串显示位置:第3列
        mov CL, 0CAH        ;定义字符串显示颜色:红底高亮闪烁绿色
        mov AX, DATASG
        mov DS, AX
        mov SI, 0H        ;定位字符串首地址
        call Show_str

    mov AX, 4C00H
    int 21H

    Show_str:
        ;寄存器压栈,防止寄存器冲突
        push SI
        mov CH, 0H
        push CX

        mov AX, STACKSG
        mov SS, AX
        mov SP, 10H
                                                          
        ;初始化显示缓冲区,并完成输出位置的计算
        mov AX, 0B800H
        mov ES, AX
        mov DI, 0H              ;定义屏幕字符显示宽度

        ;计算,并用BX来储存屏幕上所对应的M行N列的偏移地址的和
        mov AL, 0A0H
        mul DH
        mov BX, AX
        mov AL, 02H
        mul DL
        add BX, AX

        mov AL, CL        ;保存字符显示颜色

        GetStart:
            mov CL, [SI]
            mov CH, 0H
            jcxz Done
            mov CH, AL
            mov ES:[BX+DI], CX
            add DI, 02H        ;显示缓冲区中,一个字符占2个字节,所以BX应循环+2
            inc SI                                                                                                              
            jmp SHORT GetStart
        Done:
            pop CX
            pop SI
            ret                                                                                                                                               
CODESG ENDS                                                                                                                      
END start
评论次数(3)  |  浏览次数(909)  |  类型(汇编作业) |  收藏此文  | 

[  younggay   发表于  2008-08-19 10:19  ]

程序用Debug调试可以正常显示,但CMD下去什么都不显示(好像一闪而过),而在commmand.com下运行也可以正常显示。请问这是怎么回事?(不知道其他人是否也如此?) 
==========================
command才是windows提供的一个模拟dos的环境吧,cmd是命令解释作用的,好像不太一样。有些程序在cmd下会莫名其妙的,说不很清楚,所以,偶一直在command下做练习。

[  younggay   发表于  2008-08-19 10:32  ]

程序中定义了SS段: dw 16 dup (0),但当sp取值 1AH 到 20H 时候,程序运行就会出错,请问这是怎么回事?  
=================
你定义的栈段在程序中好像没有起到任何作用吧。也没有用到你定义的栈段,而且,你的
mov AX, STACKSG 
mov SS, AX 
mov SP, 10H
使你的逻辑感觉混乱,如果后面还有其他子程序可能就会混乱了,因为你push的数据,pop还原的时候肯定不对了,因为push和pop操作的时候的栈段不一致,栈的地址都被你变了。
而你所说的sp为1AH到20H出错,首先,如果按照你的ss来计算,sp为上述值的时候,就指向了你的字符串数据空间了。至于如何运行到那里,如何出错的,我想debug一下自然会分析出来的。
先把你的逻辑上的错误给理清了,在找这个问题的症结吧。

[  游客   发表于  2008-08-19 18:53  ]

谢谢了!原来是我自己没注意到,call后保存的IP是以整个64K作为SS段的,而我定义的SS只有32个字节。
但是还有问题:
1.此时SS中1A-20为什么不为0?我用Debug查看了一下,这一段空间里有数值填充。
2.如果将SP指向FFFEH,则程序不会出错,但这样做应该算是栈顶超界了吧?如果向栈中压入数据(程序中的push si,push cx),则有可能会产生不可预知的错误吧?
3.栈可以不用定义就直接使用吗?没有给栈遇险分配空间,那如果整个64k大小的段内都是代码,那执行call指令时岂不是会产生覆盖,这样做岂不是很不不安全?

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