. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->基础知识
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  为什么要加1  [待解决] 回复[ 11次 ]   点击[ 450次 ]  
kankta
[帖 主]   [ 发表时间: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。
idhyt
[第1楼]   [ 回复时间:2012-12-17 09:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-05 18:58
因为偏移是从0开始算起的
如果不+1 SA最小取1000H 加上最大偏移FFFF = 1FFFF 
结果肯定是不对的。
palm1949
[第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。这才是正解。
palm1949
[第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。(其实结果大家都知道就是右移一位。心算就行)
palm1949
[第4楼]   [ 回复时间:2012-12-20 13:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-24 18:03
最后,让我看2楼,1楼的,我是看不太明白的。我这个人有点笨,反应慢,喜欢有根据。所以根据公式反推我可以理解。
yiye3376
[第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位地址计算公式,不必纠结的
mengdana
[第6楼]   [ 回复时间:2013-01-01 18:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35
为啥20位的要弄成16位的地址再加上段呢?我个人瞎猜这是为了和以前的旧16位程序兼容,不是说二进制代码兼容,至少是源程序级的兼容,另外也为了和以前程序员的16位编程思维习惯兼容。86刚出来时可是诸候争霸,并不象今天这样统一江山,没有兼容性就没有群众基础。。。
notepad
[第7楼]   [ 回复时间:2013-01-03 20:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-03 20:06
看来你没好好看书。。8086的CPU地址总线20根,数据总线16根,为了全部利用20根地址总线,才需要段地址*16+偏移地址组成20位的。至于为什么地址总线20根,而数据总线16根,这才应该是为了兼容8位机的设定
notepad
[第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位机的设定
notepad
[第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位机的设定
geshaer
[第10楼]   [ 回复时间:2013-05-20 16:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-20 15:54
因为16位的寄存器放不下20位的地址,就跟人类一样说的都是偏移地址
lzglove
[第11楼]   [ 回复时间:2013-05-25 16:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-19 22:41
七楼说的很好,受教了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved