|
主题 : : 关于实验10的第一个子程序问题 [已解决] |
回复[ 4次 ]
点击[ 318次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-04-22 16:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03 |
书上说是首先分析屏幕上的行列位置和显存地址的对应关系
我见很多朋友在子程序的都是这样写的:
mov ax,0b800h
mov es,ax
mov al,0a0h ;每行大小
mul dh ;每行大小和行数相乘
mov bx,ax ;得每行的起始地址es:[bx]
每行大小是160个字节,为什么用行数乘以每行字节数就能得出N行的偏移地址呢?
我举个例子:如果每行是4个字节,现计算第5行的偏移地址
0,1,2,3
4,5,6,7
8,9,10,11
12,13,14,15
16,17,18,19
20,21,22,23
按4乘以5的方法去计算,应该是20开始吧,但实际应该是从16开始的
请教一下大家,为什么会这样做呢?谢谢 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-04-22 16:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-04-22 18:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2010-03-17 10:10 |
楼主很细心吧,我一直没有考虑这样的问题。
按照你说的,我们应该这么算:行数-1 乘以平均数,加列数,才能正确的得出偏移地址的。
确实如你说的啦,这才算是真正是正确的。
但是我们是在操作系统的层层包裹下活动的进行的,真的如楼上受的一样吗,(当然我也不知道具体原因,)不过我们拿事实说话,请看下面的代码。
assume cs:code
code segment
start:
mov ax,0b800h
mov es,ax
mov ax,34
mov es:[0],ax
mov ax,2
mov es:[1],ax
mov ax,4C00h
int 21h
code ends
end start
编辑-连接-运行下看看,没有任何反应。
再看
assume cs:code
code segment
start:
mov ax,0b80ah
mov es,ax
mov ax,34
mov es:[0],ax
mov ax,2
mov es:[1],ax
mov ax,4C00h
int 21h
code ends
end start
编辑连接后,会在第一排出现字母,而不是第二排的第一个。
好了,让我们深入学习研究吧,以后自然就会晓得了。切勿着急。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-04-22 22:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03 |
哦。。。原来是这样的。。。。谢谢了
因为论坛上对这个问题好像都默认为正确答案,我研究后发现原理上是有出入的,所以才提出问题。。。
望以后能有专题解答一下这个答案啦。。。。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-04-23 09:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03 |
此贴由 贴主 于 [ 2010-04-23 09:48 ] 结贴。 结贴原因:问题已解决 | | |
|