|
主题 : : 实验9两个疑问:4000个字节怎么算的,怎么找到屏幕中间的地址 [待解决] |
回复[ 18次 ]
点击[ 661次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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个字节中找到中间,我各种解释不通啊。。。这点求解释,这些搞懂了程序我自己就能憋出来了。。。 | | |
|
|
|
|
[第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个字节。这个也不绕啊 呵呵 仔细看看想想吧 | | |
|
|
|
|
[第2楼]
[ 回复时间:2012-02-19 19:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01 |
从80*25个字节中找到中间:一屏是25行 那么中间那一行就是第13行了,你要在这一行上面位置显示多少字符你推算一下啦 注意:一行是80个字符 就是160个字节 | | |
|
|
|
|
[第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个字节~~·
别抽我,我就是想不通这样算为什么不对。。。 | | |
|
|
|
|
[第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进制,计算量也太大了点,有没有简单点的算法~ | | |
|
|
|
|
[第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进制,计算量也太大了点,有没有简单点的算法~ | | |
|
|
|
|
[第6楼]
[ 回复时间:2012-02-29 21:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
回复3楼:
B8F9FH-B8000=F9FH=16*10*16=2560个。。。
这个算得不对,具体这个怎么算,楼主还是先搞明白吧。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-02-29 21:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第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个字节~~·
别抽我,我就是想不通这样算为什么不对。。。 | | |
|
|
|
|
[第9楼]
[ 回复时间:2012-03-05 20:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第10楼]
[ 回复时间:2012-03-09 14:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58 |
这么长时间了,楼上这个问题还没搞明白?
------------------
回复:报告老大,没有。。。不过后边算我就不那么算了 就用十进制的方法算 但还是不明白为啥那样算出来的结果不对。。。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2012-03-27 18:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34 |
回复:[贴 主]
------------------
这个我刚开始也不会算,现在想通了。
用十进制算是可以的,注意的地方就是每行80个字符,其实有160个字节。
4000个字节的中间是2000,再减去16,就是1984,十六进制就是7ch,但是我认为(十进制的结果)还
要减去160,表示中间的上面一行,不知这样解释楼主懂了没有? | | |
|
|
|
|
[第12楼]
[ 回复时间:2012-03-27 18:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34 |
|
|
|
|
|
[第13楼]
[ 回复时间:2012-03-27 18:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2012-03-22 15:34 |
计算上面一行,还是需要减去160个字节位。。。(因为计算出来的7c0h是中间一行的首个字节,所以应
该减去160才是正确的)
我也是个新手,如果有说错了,还请各位指正。 | | |
|
|
|
|
[第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是怎么来的 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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,也不是那样换算。 | | |
|
|
|
|
[第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=每行中间的起始地址。 | | |