. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9两个疑问:4000个字节怎么算的,怎么找到屏幕中间的地址  [待解决] 回复[ 18次 ]   点击[ 661次 ]  
idhyt
[帖 主]   [ 发表时间:2012-02-19 19:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
P188页第11行:B8000H~B8F9FH中的4000个字节....
问题:B8000H~B8F9FH怎么会是4000个字节,16*10*16=2560个字节,怎么会是4000个
      如果换成十进制,F9Fh=15*1+9*16+15*16^2=3999 从0开始算就刚好是4000个字节...
我感觉我陷入了错误的死循环了,这点就是解释不通。。。求指导。。。

还有 怎么从80*25个字节中找到中间,我各种解释不通啊。。。这点求解释,这些搞懂了程序我自己就能憋出来了。。。
tily
[第1楼]   [ 回复时间:2012-02-19 19:42 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01
B8000H~B8F9FH怎么会是4000个字节 :B8F9FH-B8000=F9FH ;F9FH = 3999(十进制),因为0到9是10个数字,所以B8000H到B8F9FH正好是4000个数字。明白了没?
书中还说了显示器一屏可以显示25行,每行80个字符,那么一屏显示25*80=2000个字符,一个字符占两个字节 所以正好4000个字节。这个也不绕啊 呵呵 仔细看看想想吧
tily
[第2楼]   [ 回复时间:2012-02-19 19:55 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01
从80*25个字节中找到中间:一屏是25行 那么中间那一行就是第13行了,你要在这一行上面位置显示多少字符你推算一下啦 注意:一行是80个字符 就是160个字节
idhyt
[第3楼]   [ 回复时间:2012-02-29 15:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
B8000H~B8F9FH怎么会是4000个字节 :B8F9FH-B8000=F9FH ;F9FH = 3999(十进制),因为0到9是10个数字,所以B8000H到B8F9FH正好是4000个数字。明白了没?
书中还说了显示器一屏可以显示25行,每行80个字符,那么一屏显示25*80=2000个字符,一个字符占两个字节 所以正好4000个字节。这个也不绕啊 呵呵 仔细看看想想吧
------------------
回复:B8F9FH-B8000=F9FH=16*10*16=2560个。。。
比如二进制的000到111不就可以算成2*2*2=8 刚好8个字节~~·
别抽我,我就是想不通这样算为什么不对。。。
idhyt
[第4楼]   [ 回复时间:2012-02-29 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
从80*25个字节中找到中间:一屏是25行 那么中间那一行就是第13行了,你要在这一行上面位置显示多少字符你推算一下啦 注意:一行是80个字符 就是160个字节
------------------
回复:我晓得是13行撒,但是偏移地址怎么算?从000开始一行加160个字节,加13次,而且还要换算成16进制,计算量也太大了点,有没有简单点的算法~
idhyt
[第5楼]   [ 回复时间:2012-02-29 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
从80*25个字节中找到中间:一屏是25行 那么中间那一行就是第13行了,你要在这一行上面位置显示多少字符你推算一下啦 注意:一行是80个字符 就是160个字节
------------------
回复:我晓得是13行撒,但是偏移地址怎么算?从000开始一行加160个字节,加13次,而且还要换算成16进制,计算量也太大了点,有没有简单点的算法~
tomato
[第6楼]   [ 回复时间:2012-02-29 21:45 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
回复3楼:

B8F9FH-B8000=F9FH=16*10*16=2560个。。。 

这个算得不对,具体这个怎么算,楼主还是先搞明白吧。
tomato
[第7楼]   [ 回复时间:2012-02-29 21:46 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
如果楼主不确定,可以使用系统中的计算器计算一下。
idhyt
[第8楼]   [ 回复时间:2012-03-05 20:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
回复3楼:

B8F9FH-B8000=F9FH=16*10*16=2560个。。。 

这个算得不对,具体这个怎么算,楼主还是先搞明白吧。
------------------
回复:
我知道不对。。。就是想不通为什么不对。。。
比如二进制的000到111不就可以算成2*2*2=8 刚好8个字节~~· 
别抽我,我就是想不通这样算为什么不对。。。
tomato
[第9楼]   [ 回复时间:2012-03-05 20:50 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
这么长时间了,楼上这个问题还没搞明白?
idhyt
[第10楼]   [ 回复时间:2012-03-09 14:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
这么长时间了,楼上这个问题还没搞明白?
------------------
回复:报告老大,没有。。。不过后边算我就不那么算了 就用十进制的方法算 但还是不明白为啥那样算出来的结果不对。。。
powlin1991
[第11楼]   [ 回复时间:2012-03-27 18:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34
回复:[贴 主]
------------------
这个我刚开始也不会算,现在想通了。

用十进制算是可以的,注意的地方就是每行80个字符,其实有160个字节。

4000个字节的中间是2000,再减去16,就是1984,十六进制就是7ch,但是我认为(十进制的结果)还

要减去160,表示中间的上面一行,不知这样解释楼主懂了没有?
powlin1991
[第12楼]   [ 回复时间:2012-03-27 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34
不好意思,是7c0h
powlin1991
[第13楼]   [ 回复时间:2012-03-27 18:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34
计算上面一行,还是需要减去160个字节位。。。(因为计算出来的7c0h是中间一行的首个字节,所以应

该减去160才是正确的)

我也是个新手,如果有说错了,还请各位指正。
wzhh1986
[第14楼]   [ 回复时间:2012-05-11 19:31 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35
B8F9FH-B8000=F9FH=16*10*16=2560你这个算法有问题啊
应该是这么算的:
F9FH=F*(16^2)+9*(16^1)+F*(16^0)=3999
不知道你的16*10*16是怎么来的
dela2000
[第15楼]   [ 回复时间:2012-11-23 11:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-19 00:22
楼主的思维和我之前的一样,还停留在十进制时代,关于中间显示的内存地址在哪里?我的分析思路如下:

问题1:
书上讲:25行80个字符&字符属性,因每个字符&字符属性占160字节,所以一屏幕(一页)就是25*160=4000字节
具体可以打开dos界面,输入字符,自己数下就可以得出这个结论;

问题2:屏幕中间分为行和列,中间行就是第13行,如何求得第13行的起始地址
书上讲:
第一行 B800:000~09F
第二行 B800:0A0~13F
第三行 B800:140~1DF
关键是由上述规律可以看出第N行的地址=0A0*(N-1),特别提醒N-1要转成16进制,
举例:第1行,对应起始地址0A0*(1-1)=000
     第2行,对应起始地址0A0*(2-1)=0A0
     ............................
     第9行,对应起始地址0A0*(9-1)=500
     第10行,对应起始地址0A0*(A-1)=5A0
     第11行,对应起始地址0A0*(B-1)=640
     ...............................
     第13行,对应起始地址0A0*(D-1)=780

问题3:我们已经知道中间的行的起始地址,现在要问行中间的地址,也就是列的概念,由书中可知‘welcome to masm!’字符&字符属性占32个字节,每行共160个字节,所以中间地址为40H
换算方法(160-32)/2=64,转化为16进制为40H

至此,我们知道了行和列,所以可以得知中间起始地址为=780H+40H=7C0,结束地址为=7C0+20=7DF,
故中间显示字符所占的内存地址为B800:07C0~07DF
stop1204
[第16楼]   [ 回复时间:2013-05-17 07:50 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
25行  80 列    一行160个字符 
25*160 =4000 

中间就是  25/2  ≈13
80/2 = 40
dzxxbj
[第17楼]   [ 回复时间:2013-05-22 18:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-22 12:56
楼主的换算方法,就好比由 4/2=4-2=2,从而得出 8/4=8-4=4。 十六进制换算十进制是有标准步骤的,即使有巧方法,也不是那个方法,而且000~111是二进制换算十进制,是两回事。B8000H~B8F9FH=F9Fh=15×1+9×16+15×16×16=3999, 而111-000=111=1×1+1×2+1×2×2=8,也不是那样换算。
dzxxbj
[第18楼]   [ 回复时间:2013-05-22 18:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-22 12:56
回复:[第15楼]
------------------
问题2:的讲解很好,十六进制更清楚,我都用160×(N-1)这样就多了一步换算,不容易理解。

问题3:的做法可以先从小数字开始理解,因为160是偶数,而且首地址从偶数开始,所以假设一行有10个字节,地址从0开始:0 1 2 3 4 5 6 7 8 9。因为待显示的句子也为偶数个字符,所以假设我们要在中间显示2个字符,加上属性就要4个字节,那么存放3 4 5 6这四个单元,就正好在中间了。那么开始的3的计算方法便是:(10-4)/2,推广后的计算方法便是:(每行的字节数目 - 待存放的字节数目)/2=每行中间的起始地址。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved