. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  为什么实验九不能显示字符?  [已解决] 回复[ 7次 ]   点击[ 429次 ]  
huibian2009
[帖 主]   [ 发表时间:2009-08-03 11:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
我在做这个实验的时候,发现一个问题,为什么偏移地址00——100中无法即时显示字符呢,我的程序代码如下:
assume cs:a,ds:b
b segment
        db 'welcome to masm!'
b ends

a segment
start:        mov ax,0b800h
        mov ds,ax;将显示缓冲区段地址送入DS中
        mov ax,b
        mov es,ax;将数据地址送入ES中
        mov bx,100h
        mov di,0
        mov bp,0
        mov cx,16
s:        mov al,es:[bp]
        mov ah,02h
        mov ds:[bx][di],ax
        mov ah,24h
        mov ds:[bx+0A0h][di],ax
        mov ah,71h
        mov ds:[bx+140h][di],ax
        inc bp
        add di,2
        loop s
        mov ax,4c00h
        int 21h
a ends        
        
end start
当我把BX的值设为100时,在显示器上为什么看不到任何东西?而把100换成大家算出的720H则可以正常执行。按照书上说的B800-009f对应显示器的第一行,为什么实际应用中却看不到东西呢,还有本人对于如何确定屏幕中间的偏移地址也还是有点不太明白。我是这样算的
一行占160个字节,那么屏幕中间位置为第12行,用160*12=1920(这个地方是不是应该用16进制的乘法呢)然后算出一行为0-159个字节单元,那么中间的位置应该是64?1920+64=1984,换算成16进制=7c0请各位老师指点一下,我的思路哪里出了问题了?谢谢!
tsembrace
[第1楼]   [ 回复时间:2009-08-03 15:35 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
是执行完程序后把执行程序时候的第一行给顶上去了吧~
huibian2009
[第2楼]   [ 回复时间:2009-08-04 08:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
哦,也许吧,谢谢提醒。
mess
[第3楼]   [ 回复时间:2009-08-04 10:44 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
哦,也许吧,谢谢提醒。
------------------
回复:"也许吧"-这个是说楼主已经明白并验证了呢,还是压根还不明白。这样解决问题可不要。

第一个问题,解决问题要注意用实验或其他方式验证结论。

第二问题:如何看程序的运行结果。你用的是debug下运行看结果吧,对于上面这个程序把数据直接显示到屏幕,也可以直接运行exe文件查看结果。

至于上面的算位置的公式不多说了,可以自己直接写显存的方式验证(自己独立努力想办法了才有可能发现一些小技巧,如果只是听人说了认识能多深刻呢,发现技巧的方法怎么学到呢)。
一行占160个字节
---------------
正确,当是记住一行能显示80个字符更合理,如果现实10个字符的字符串,只要(80-10)/2就知道在第几个字符位置显示了,然后再乘以2(这个2的原因是一个字符需要用一个字来存储),即公式为(80-10)/2*2。
huibian2009
[第4楼]   [ 回复时间:2009-08-05 09:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
多谢mess老师的教导,不知道为什么我生成的EXE文件,在DEBUG下调试正常,但是直接运行的话,只是一闪就消失了。
abob
[第5楼]   [ 回复时间:2009-08-05 10:04 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
还有这种事,一般来说出现这种情况我要检查程序的返回语句是否正确了(mov ax,4c00h int 21h),因为debug调试的时候可能没有执行这句,而运行exe的手不能返回。然后没问题就看看运行环境是不是有问题。

楼主的代码我编译连接了,没有问题,exe运行正常,运行环境是第四章的运行环境和编译器。(运行/command,这个command和cmd是有区别的。)
huibian2009
[第6楼]   [ 回复时间:2009-08-20 10:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
谢谢提醒!
huibian2009
[第7楼]   [ 回复时间:2009-08-24 11:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
此贴由 贴主 于 [ 2009-08-24 11:55 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved