. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于实验10的第一个子程序问题  [已解决] 回复[ 4次 ]   点击[ 318次 ]  
okenny
[帖 主]   [ 发表时间: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开始的

请教一下大家,为什么会这样做呢?谢谢
okenny
[第1楼]   [ 回复时间:2010-04-22 16:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
麻烦也帮忙分析一下列数是如何计的,谢谢
110_112
[第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

编辑连接后,会在第一排出现字母,而不是第二排的第一个。

好了,让我们深入学习研究吧,以后自然就会晓得了。切勿着急。
okenny
[第3楼]   [ 回复时间:2010-04-22 22:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
哦。。。原来是这样的。。。。谢谢了
因为论坛上对这个问题好像都默认为正确答案,我研究后发现原理上是有出入的,所以才提出问题。。。
望以后能有专题解答一下这个答案啦。。。。
okenny
[第4楼]   [ 回复时间:2010-04-23 09:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
此贴由 贴主 于 [ 2010-04-23 09:48 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(110_112):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved