|
主题 : : 为什么要加1 [待解决] |
回复[ 11次 ]
点击[ 450次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-12-16 09:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-11-29 14:36 |
(2)一数据存放在内存20000H单元中,现给定段地址为SA,若用偏移地址寻到此单元,则SA最小最大各多少?
20000H=(SA*16+EA);EA取值范围:0000H~FFFFH---->SA*16=(20000H~10001H)
则SA为10001H/16~2000H;注意10001H/16取整应+1,则SA最小为1001H,最大为2000H。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-12-17 09:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58 |
因为偏移是从0开始算起的
如果不+1 SA最小取1000H 加上最大偏移FFFF = 1FFFF
结果肯定是不对的。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2012-12-20 13:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-24 18:03 |
用我这种方法。
是这样的计算的:物理地址=SA *16+EA
SA:段地址,EA:偏移地址 汇编里面的名词规定
按楼上说的太抽象了。
你可以列式子。20000h = SA*16+EA。所以SA=(20000-EA)/16
对不对?
然后可以算到2000h-EA/16
这是我们不知道EA是多少,但是根据题意EA是有范围的。如果让SA最小又能寻找到,就需要让EA最大:所以EA取值ffffh。
然后用计算器算ffff/16得1001h。这才是正解。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2012-12-20 13:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-24 18:03 |
补充一下,ffff/16等于fff,2000-fff等于1001h,注意计算的时候用计算器,win自带的就行。在查看里调成科学型。这是学汇编必备的利器。注意ffff/16的计算,16是十进制数,所以除的时候要调成10进制的16。(其实结果大家都知道就是右移一位。心算就行) | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-12-20 13:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-24 18:03 |
最后,让我看2楼,1楼的,我是看不太明白的。我这个人有点笨,反应慢,喜欢有根据。所以根据公式反推我可以理解。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2012-12-23 10:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-12-23 09:45 |
注意,8086的cpu其实是20位的,只不过为了方便运算,才用16位运算的,比如8位,16位,32位,64位cpu,所以你寻址就需要段地址*16+偏移地址,也就是段地址前面+1,这个公式只是为了达到地址为20位地址计算公式,不必纠结的 | | |
|
|
|
|
[第6楼]
[ 回复时间:2013-01-01 18:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35 |
为啥20位的要弄成16位的地址再加上段呢?我个人瞎猜这是为了和以前的旧16位程序兼容,不是说二进制代码兼容,至少是源程序级的兼容,另外也为了和以前程序员的16位编程思维习惯兼容。86刚出来时可是诸候争霸,并不象今天这样统一江山,没有兼容性就没有群众基础。。。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2013-01-03 20:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-03 20:06 |
看来你没好好看书。。8086的CPU地址总线20根,数据总线16根,为了全部利用20根地址总线,才需要段地址*16+偏移地址组成20位的。至于为什么地址总线20根,而数据总线16根,这才应该是为了兼容8位机的设定 | | |
|
|
|
|
[第8楼]
[ 回复时间:2013-01-03 20:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-03 20:06 |
为啥20位的要弄成16位的地址再加上段呢?我个人瞎猜这是为了和以前的旧16位程序兼容,不是说二进制代码兼容,至少是源程序级的兼容,另外也为了和以前程序员的16位编程思维习惯兼容。86刚出来时可是诸候争霸,并不象今天这样统一江山,没有兼容性就没有群众基础。。。
------------------
回复:看来你没好好看书。。8086的CPU地址总线20根,数据总线16根,为了全部利用20根地址总线,才需要段地址*16+偏移地址组成20位的。至于为什么地址总线20根,而数据总线16根,这才应该是为了兼容8位机的设定 | | |
|
|
|
|
[第9楼]
[ 回复时间:2013-01-03 20:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-03 20:06 |
注意,8086的cpu其实是20位的,只不过为了方便运算,才用16位运算的,比如8位,16位,32位,64位cpu,所以你寻址就需要段地址*16+偏移地址,也就是段地址前面+1,这个公式只是为了达到地址为20位地址计算公式,不必纠结的
------------------
回复:为啥20位的要弄成16位的地址再加上段呢?我个人瞎猜这是为了和以前的旧16位程序兼容,不是说二进制代码兼容,至少是源程序级的兼容,另外也为了和以前程序员的16位编程思维习惯兼容。86刚出来时可是诸候争霸,并不象今天这样统一江山,没有兼容性就没有群众基础。。。
------------------
回复:看来你没好好看书。。8086的CPU地址总线20根,数据总线16根,为了全部利用20根地址总线,才需要段地址*16+偏移地址组成20位的。至于为什么地址总线20根,而数据总线16根,这才应该是为了兼容8位机的设定 | | |
|
|
|
|
[第10楼]
[ 回复时间:2013-05-20 16:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-05-20 15:54 |
因为16位的寄存器放不下20位的地址,就跟人类一样说的都是偏移地址 | | |
|
|
|
|
[第11楼]
[ 回复时间:2013-05-25 16:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-05-19 22:41 |
|