数据段的起始地址必须是16的倍数?
下图来自王爽的《汇编语言》第二版,第53页。
他这里说,起始地址为16的倍数。 很奇怪,为什么非要16的倍数呢。 如果我就想用内存的第五、第六、第七 这三个字节,难道不行吗?
第二个问题,他让 N<=64K。前面的章节说8086CPU地址总线有20个,也就是可以寻址 2^20 个字节,算一算,是一兆。 这里为什么要让长度小于64K呢?
[解决办法]
起始指的是偏移地址为0的情况下,段地址不管怎么变化,最后的物理地址都是16的倍数。
http://topic.csdn.net/u/20110718/10/a2df88a3-9ef9-4b7c-be9f-159fea7db219.html
[解决办法]
不用这样死读书吧,建议灵活掌握。
我看你问了很多类似的问题,不是说问题不对,但有些问题...
[解决办法]
一、不是不让,就是让你把段地址取在不是16整数倍的地址上,你能做到吗?想一想段寄存器中的数据如果是0B07h,段地址就是0B07h吗?
二、有20根地址总线,就是说它有能力表示出0~1048575个号码来,再多了就表示不出来了,把这些号码一对一地对应到存储器单元,这就是你说的它能寻址1M个存储单元。可是问题来了,你地址总线有20根,但寄存器却是16位的,一个寄存器的数据只能表示出 0~65535之间的数(号码),所以一个段只能管理65536个存储器单元。(为什么DOS程序可以做成多段的?有什么数据段、代码段、附加段、堆栈段?原因之一不就是要提高使用存储器的能力吗。)
[解决办法]
我感觉楼主问的问题都很有水平,至少比那些问作业的强几千倍几百倍。如果有疑问的话,如果能解决最好还是立即就解决。不知道你在网上看没看过国外的大学上课的样子,基本所有的老师都要求学生如果在课上遇到问题马上就要问,最极端的那个谁问问题了就给一块糖,没错,是大学。我在教我表弟汇编语言的时候我就发现了,我表弟根本就不会问问题。
[解决办法]
在学习理论的时候遇到的问题是必须要弄懂的,否者你问一万个具体的问题也不一定能把理论弄明白了。
[解决办法]
你忘了这个“段地址 * 16 + 偏移地址 = 物理地址”存在的原因是什么了么?主要的原因是用寄存器无法直接存放物理地址。到了32位的CPU上已经不存在无法直接存放的问题了,32位的寄存器直接就可以直接寻址4G的内存了。但32位的CPU上的段寄存器还是存在的,而且段在某种形式上也保留下来了。但具体的东西比8086上的复杂多了,你有兴趣学完8086再学32位的保护模式汇编吧,那个东西不是一句两句话能说明白的。
[解决办法]
2.6
[解决办法]
段起始地址=段地址*16+0
你说能不是16的倍数么?
书上的公式很清楚吧
[解决办法]
王爽的书说的很明白,那本书是基于8086cpu的,所以只有实模式,不存在32位上的保护模式等其他模式.
[解决办法]
我倒,起始地址,您老人家+5那是起始地址么
[解决办法]
你还是仔细看看书吧.勤学好问,好问是建立在勤学基础上的.
[解决办法]
中国教育一向如此,要是问了一个问题老师也不会老师难堪,,,我高一时就是问生物老师练习册上的一个问题,,TM老师都居然不知道,,呃呃呃三分钟没说清楚是为什么,,最后说题目有问题要上网查一下,,,操,如此老师
[解决办法]
后面加了就是物理地址了,起始地址加0就可以了
段地址 * 16 = 段起始地址
所以起始地址无论如何都是16的倍数,,当然就是在8086下的
[解决办法]
我现在也在看王爽的这本书,,,感觉还是有很多地方不清楚的,呵呵,,刚好和LZ一起学习了
[解决办法]
可以,,但你这样就不是起始地址了
起始地址就是说开始的地址,,再加非0就到开始地址后面去了
[解决办法]
因为CPU是 (段起始地址*16)+偏移地址 来读取数据的
而DS存放的是段地址,,IP是上面的公式就是 DS*16+IP
你是想说 DS = DS + 1 还是 DS = DS*16 + 1 这样来来改变段起始地址吧,,但这应该不可以吧
到CPU读取下条指令时就是
DS*16+IP
按你的就变成了
(DS + 1)*16 + IP了,但段起始地址就变成了 (DS + 1)*16 , 所以还是16的倍数
当然,你可以认为 DS*16+1 才是真正的段起始地址,,但这种理解是不正解的,,而已CPU也不是这样工作的吧
目前所我所知,只有CPU读取指令时才会运算得到段起始地址(我也是新手,还看着前面部分),所以你想修改段起始地址是不可能的吧,,,这种理解也是错误的,,会影响你后面的学习的
LZ要把段地址和段起始地址和物理地址的概念理清
[解决办法]
8086汇编程序段首地址不是一定为16的倍数!
王爽书上那么说,是因为那本书是入门用来入门.不牵涉复杂的.那么说,是方便刚入门的学习者的学习.
一般在80386以下汇编编译时,对段间的连接默认定位类型设为PARA(节-16字节).简单地说就是以16字节为最小单位进行连接.
当然,段间连接还有其他类型.
如:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 首地址不一定是16的倍数 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STACKS SEGMENT BYTE
DB 31 DUP (1)
STACKS ENDS
DATAS SEGMENT BYTE
DB "ABCDEFG"
DATAS ENDS
CODES SEGMENT BYTE
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,16
NOP
NOP
NOP
MOV AH,4CH
INT 21H
CODES ENDS
END START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-u
0BB4:0006 B8B30B MOV AX,0BB3 ;注意这里,CS起始地址不是XXXX:0000
0BB4:0009 8ED8 MOV DS,AX
0BB4:000B B8B20B MOV AX,0BB2
0BB4:000E 8ED0 MOV SS,AX
0BB4:0010 BC1000 MOV SP,0010
0BB4:0013 90 NOP
0BB4:0014 90 NOP
0BB4:0015 90 NOP
0BB4:0016 B44C MOV AH,4C
0BB4:0018 CD21 INT 21
0BB4:001A 8B2D MOV BP,[DI]
-g13
AX=0BB2 BX=0000 CX=003A DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=0BB3 ES=0BA2 SS=0BB2 CS=0BB4 IP=0013 NV UP EI PL NZ NA PO NC
0BB4:0013 90 NOP
-d ss:0
0BB2:0000 01 01 01 01 01 01 01 01-00 00 13 00 B4 0B 9F 05 ................
0BB2:0010 01 01 01 01 01 01 01 01-01 01 01 01 01 01 01 41 ...............A;这个A是DS段的首数据,它的地址不是XXXX:0000
0BB2:0020 42 43 44 45 46 47 B8 B3-0B 8E D8 B8 B2 0B 8E D0 BCDEFG..........;B8 B3 0B是CS段的MOV AX,0BB3,它的地址也不是XXXX:0000
0BB2:0030 BC 10 00 90 90 90 B4 4C-CD 21 8B 2D E8 32 00 73 .......L.!.-.2.s
0BB2:0040 12 83 C7 03 FE C8 75 F1-2E C7 06 4A 91 08 00 B4 ......u....J....
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
再说明:王爽书上说的是默认情况下.不必以偏概全.
[解决办法]
每天回帖即可获得10分可用分!