数据段的起始地址必须是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程序可以做成多段的?有什么数据段、代码段、附加段、堆栈段?原因之一不就是要提高使用存储器的能力吗。)
[解决办法]
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分可用分!