|
主题 : : 段最大64k,那最小多少?? [待解决] |
回复[ 56次 ]
点击[ 3027次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-06-26 15:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-06-26 14:20 |
|
|
|
|
|
[第1楼]
[ 回复时间:2007-07-15 20:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18 |
|
|
|
|
|
[第2楼]
[ 回复时间:2007-07-27 10:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
|
|
|
|
|
[第3楼]
[ 回复时间:2007-08-06 19:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-08-06 18:40 |
我想问一下为什么是16Byte 呢?麻烦各位给个回答 先谢谢了 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-08-07 10:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
首先,段空间最大为64K应该很明确了,是因为对段空间数据进行操作的是偏移地址,而偏移地址是0000H-ffffH这么大(64K)的一个空间。要达到这个最大的段空间,偏移地址必须是从0H开始的,这就是问题的根源了。每定义一个段,编译器就会把这个段的偏移地址设置成0H,这样做的目的也是为了获得数据存储操作的最大空间。在声明一个新段的时候,对物理地址的操作有两种,一是改变偏移地址,二是改变段地址。从上面的分析来看,程序为了获得最大的数据操作空间,已经将每个段的偏移地址默认都设置成0H,那么,对物理地址进行的更改只能发生在段地址上了。段地址的最小改变单位为1,但是由于 物理地址 = 段地址 X 10H + 偏移地址 ,所以,段地址的一个最小改变单位1所造成的物理地址改变量是 1 X 10H = 10H = 16 。又因为一个内存空间最小单位是字节,所以段地址的每次声明改变的物理内存空间最小是16字节,也就是段的最小改变量就是16个字节。
所以,本人认为,段最大空间和最小空间的设计是相辅相成的,这跟计算机寻址方式的设计也有很大的关联。在这里就不再去推测编译器设计者当初的理念了。
不知道楼主对我的分析是不是满意。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2007-08-07 10:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
|
|
|
|
|
[第6楼]
[ 回复时间:2007-08-13 16:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:31
信誉值:1
注册日期:2007-06-26 11:44 |
回复:[第4楼]
------------------
fishboy的推理很合理,但这是段地址空间的分配问题,这本身是这个问题的一部分了。
我就申请一8个字节大小的数据段,难道不行吗?
答案是肯定的,可以
段的最大是多少?开对谁来说?
如果对于程序员来说,段的大小是在0K--64K这样一个范围的。
如果对于编译器的分配来说,段的最小是16个字节。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2007-08-21 15:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-08-21 15:33 |
|
|
|
|
|
[第8楼]
[ 回复时间:2007-09-29 17:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-09-27 09:02 |
回复:[第7楼]
------------------
为什么没有意义呢? | | |
|
|
|
|
[第9楼]
[ 回复时间:2007-09-29 17:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:22
信誉值:0
注册日期:2007-09-24 10:42 |
|
|
|
|
|
[第10楼]
[ 回复时间:2007-10-01 12:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10 |
段最大64k,那最小多少??
当给定一个段地址(假设为A)后,我们通过这个段地址可以找到的空间范围为: A:0---A:ffff.翻译成物理地址为:A*16+0 --- A*16+ffff.
当我们求给定的一个段,能访问的范围就是 : 0 -- ffff即从0到64k大小的范围,最小则为0
例子:
1,定义一个空的数据段(段名为data)
data segment
data ends
则data段的空间大小为0
2,定义有一个数据的数据段(段名为data)
data segment
db 'a'
data ends
则数据段的空间大小为16个字节. | | |
|
|
|
|
[第11楼]
[ 回复时间:2007-10-06 21:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:7
注册日期:2007-09-29 22:17 |
我感觉楼上说的对,虽然可能段的改变的最小单位是16字节,但段的大小最小是可以为0或者一个字节 或2个的
比如说堆栈也应该算是一个段吧,我就定义一个DB 0 我想也可以的吧 这也应该是一个段,所以我认为 在检测点中有个题目说段的大小可以是8BYTE 我认为应该是正确的。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2007-10-11 16:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-09-26 15:34 |
十一楼说的好像也有点道理呢 期待高手给个明确的回复 | | |
|
|
|
|
[第13楼]
[ 回复时间:2007-10-16 10:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2007-10-09 08:42 |
本人初学就这个问题思考了一下,个人认为说16BYTE这是从常识上来讲是OK的,说0BYTE从理论上来讲也没有错.
还有说8BYTE的,大家知道段地址是以16的倍数来计算的,我们可以说,我只使用了这个段的8BYTE的空间,但这个段肯定不是8BYTE,因为我无法以其他段地址+16以内的偏移量来访问空下的空间,所以除了你使用的这个8BYTE,还有空下的8BYTE空间一起划在这个段内..
我是我初学者的想法,哈哈 | | |
|
|
|
|
[第14楼]
[ 回复时间:2007-10-24 00:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2007-10-20 14:34 |
|
|
|
|
|
[第15楼]
[ 回复时间:2007-10-24 05:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2007-10-22 22:57 |
设定一个段如2000H.那过物理地址为2000:0~~2000:FFFF
FFFF(最大偏移处)有一个字节.
0(最小偏移处)也有一个字节.
所以.我想.段最小为0偏移
8bit---64k | | |
|
|
|
|
[第16楼]
[ 回复时间:2007-10-24 21:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2007-10-22 22:57 |
|
|
|
|
|
[第17楼]
[ 回复时间:2007-10-25 02:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2007-10-20 14:34 |
这个“段”指的是栈段,一个栈段最少要有一个元素吧,栈顶跟栈底构成一个最小的栈元素,所以一个栈段最小的长度也应该有两个单元位,就是二个字节啦,就是4bit 啦 | | |
|
|
|
|
[第18楼]
[ 回复时间:2007-10-25 12:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
to hellword:
2个字节怎么会是4bit?一个字节就8bit了。还有,寻址最小的单位为字节。 | | |
|
|
|
|
[第19楼]
[ 回复时间:2007-10-26 22:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47 |
这儿争论有什么意思,做个实验测试一下就可以了,最大是64K应该没有人反对吧
那就是最小了,有的说0 byte, 有的说16Bytes, 有的说其他的,那到底是多少,我们看这个程序
assume cs:code, ds:data
data segment
data ends
code segment
start: mov ax, data
mov ds, ax
mov bx, cs
sub ax, bx
code ends
end start
这里,我首先定义了一个空的数据段,接着定义了一个代码短,我们看看这个数据段的起始地址和代码段的起始地址不就知道了一个段的最小字节数了吗
这是debug的结果:
-u
144B:0000 B84B14 MOV AX,144B
144B:0003 8ED8 MOV DS,AX
144B:0005 8CCB MOV BX,CS
144B:0007 2BC3 SUB AX,BX
-t
AX=144B BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=143B ES=143B SS=144B CS=144B IP=0003 NV UP EI PL NZ NA PO NC
144B:0003 8ED8 MOV DS,AX
-t
AX=144B BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=144B ES=143B SS=144B CS=144B IP=0005 NV UP EI PL NZ NA PO NC
144B:0005 8CCB MOV BX,CS
-t
AX=144B BX=144B CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=144B ES=143B SS=144B CS=144B IP=0007 NV UP EI PL NZ NA PO NC
144B:0007 2BC3 SUB AX,BX
-t
AX=0000 BX=144B CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=144B ES=143B SS=144B CS=144B IP=0009 NV UP EI PL ZR NA PE NC
144B:0009 007511 ADD [DI+11],DH DS:0011=08
-
大家看第一条反汇编指令:
144B:0000 B84B14 MOV AX,144B
第一条指令,是把数据段的段地址送入AX,而这里清楚的显示,反汇编后的数据段段地址和
代码段的段地址都是144B,而我们知道偏移地址都是从0开的,看第一条指令的偏移地址也是0,
也就是说,代码段虽然我们定义了,但是没有占据空间,这也说明了,一个段的最小空间为0,
当它没有数据的时候,但是当它有数据的时候,最小空间是16个字节,为什么这样说,我把上面的程序稍微修改一下:
assume cs:code, ds:data
data segment
db 0
data ends
code segment
start: mov ax, data
mov ds, ax
mov bx, cs
sub ax, bx
code ends
end start
看看反汇编的结果:
-u
144C:0000 B84B14 MOV AX,144B
144C:0003 8ED8 MOV DS,AX
144C:0005 8CCB MOV BX,CS
144C:0007 2BC3 SUB AX,BX
144C:0009 1D0875 SBB AX,7508
144C:000C 1B8B5EFE SBB CX,[BP+DI+FE5E]
144C:0010 F6471008 TEST BYTE PTR [BX+10],08
144C:0014 7403 JZ 0019
144C:0016 E9FE00 JMP 0117
144C:0019 837F0C00 CMP WORD PTR [BX+0C],+00
144C:001D 7403 JZ 0022
144C:001F E9F500 JMP 0117
就看第1条指令:
144C:0000 B84B14 MOV AX,144B
这条指令把数据段的段地址送入AX
而很显然,程序的第一条指令的地址是144C:0000
也就是说代码段的段地址为144C, 144C和144B相差 1H,而物理地址上就是相差 10H,10H用1十进制表示不就是16吗,也就是16个字节,大家再看看下面的结果:
-d 144B:0
144B:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
144B:0010 B8 4B 14 8E D8 8C CB 2B-C3 1D 08 75 1B 8B 5E FE .K.....+...u..^.
144B:0020 F6 47 10 08 74 03 E9 FE-00 83 7F 0C 00 74 03 E9 .G..t........t..
144B:0030 F5 00 B8 2D 00 E9 9E 00-E8 2B 13 89 44 04 8B 5C ...-.....+..D..\
144B:0040 02 8A 47 02 8B 5C 04 88-47 02 8B FB 83 C7 04 8B ..G..\..G.......
144B:0050 5E FE C4 5F 08 26 8B 47-16 89 45 0C FF 74 02 E8 ^.._.&.G..E..t..
144B:0060 9C 0E 8B 44 04 89 44 02-C7 44 04 00 00 89 7E FE ...D..D..D....~.
144B:0070 2B FF E9 B2 00 8B 5C 02-F6 47 14 10 74 03 E9 A6 +.....\..G..t...
大家来看看这段内存的内容,
从144B:0000到144B:000F 正好是数据段的内容
而从144B:0010开始就是代码段的内容,也就是144C:0000,再看一看前面3个字节的内容
144B:0010 B8 4B 14
B8 4B 14 对照反汇编的第一条指令 144C:0000 B84B14 MOV AX,144B
一模一样,这就说明代码段和数据段相差16字节。这也解释了迎合了代码段的起始地址必须是16的倍数这个论断。
总结一下就是,如果一个段中有内容的话,那么这个段最小占16个字节的空间,如果没有内容,那么占的空间为0个字节。当然一个段最大就是64K个字节了。
如果大家对我的分析有何疑问,欢迎批评指正,让大家共同进步。 | | |
|
|
|
|
[第20楼]
[ 回复时间:2007-10-28 00:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2007-10-22 22:57 |
能做这个实验.还带解说.真牛
这个问题我在15楼回答后.想了一天.终于想通了.当然15楼是错的.
最小是16个字节
段是可以重复的.就算没有内容也是16字节.
我们来假设一个物理空间00000-000F0.那么段地址就是0000-000F.
它只可以分为16个段0000 0001 0002 --- 000c 000e
如果段是8个字节的话.它可以分为至少30个段.那么这些段地址又是多少呢
如果段可以到0....这个又能分出多少个段地址呢.它们是多少..
我们可以寻址出(计算所能表示的最大地址空间)里的任意地址.用 段:偏移的形式组合才可以.如果一个段都可以小到最小单位.还用偏移作什么呢.我们最终的目的是寻址.只须知道它们合力才可以寻址0-64K.少了谁都不可以. | | |
|
|
|
|
[第21楼]
[ 回复时间:2007-10-28 17:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:31
信誉值:1
注册日期:2007-06-26 11:44 |
|
|
|
|
|
[第22楼]
[ 回复时间:2007-10-28 18:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53 |
[引用] helloworld [第14楼]
为什么偏移地址不可以是0.1呢
-----------------------------------
计算机系统的设计是为了更好的为人们解决问题。说白了它其中的很多实现方式就是一种人为的规定,因为这样实现既能很好的完成所需功能又不失合理性,所以就被采用了。
请问,你愿意使用偏移地址为任意实数(甚至还支持复数)的计算机吗?
追根溯源不是异想天开! | | |
|
|
|
|
[第23楼]
[ 回复时间:2007-11-04 12:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:9
注册日期:2007-11-01 20:06 |
|
|
|
|
|
[第24楼]
[ 回复时间:2007-11-15 01:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-26 12:53 |
|
|
|
|
|
[第25楼]
[ 回复时间:2007-11-27 21:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32 |
|
|
|
|
|
[第26楼]
[ 回复时间:2008-01-05 22:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-05 13:12 |
“也就是说,代码段虽然我们定义了,但是没有占据空间,这也说明了,一个段的最小空间为0,
”
应该是 “也就是说,数据段虽然我们定义了,但是没有占据空间,这也说明了,一个段的最小空间为0,
” 吧 | | |
|
|
|
|
[第27楼]
[ 回复时间:2008-01-08 14:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-12-19 11:15 |
AX=144B BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=143B ES=143B SS=144B CS=144B IP=0003 NV UP EI PL NZ NA PO NC
144B:0003 8ED8 MOV DS,AX
========================================
为什么在程序执行前DS和ES比SS和CS的地址少10h?IP怎么不是指向0而是指向3? | | |
|
|
|
|
[第28楼]
[ 回复时间:2008-01-09 10:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33 |
不知道楼上兄弟学到了第几章,如果现在的进度是第二章,建议留着疑问看书,等到后面第四章的就能明白了。用书上前言的一个词叫“知识屏蔽”,按照书上的进度很快就能知道答案了,现在说了你也可能不是很清晰,反而会觉得乱。
IP怎么不是指向0而是指向3?
-----
比如这个,原因很简单,因为当前要执行的指令是第二条指令mov ds,ax。在第二章上有个图例讲的是ip是什么时候发生变化的,和这个讲的重点不同。
在比如学了第六章后你会发现,不是程序加载后ip一定默认是0的。 | | |
|
|
|
|
[第29楼]
[ 回复时间:2008-02-19 16:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-15 17:02 |
段不是以字为单位的吗?
字是两个字节,当然是16了 | | |
|
|
|
|
[第30楼]
[ 回复时间:2008-02-20 10:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-02-20 10:20 |
|
|
|
|
|
[第31楼]
[ 回复时间:2008-02-24 16:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-05 12:43 |
同意19楼的,
我是这样想的,
定义了数据段但是没有数据的时候,是0这很好理解
当定义了,但是小于16B的时候,因为一个一个段的首地址必是16的倍数,所以下一个段会从下一个16的倍数开始,所以数据段就相当于占了16B了啊!
要是不对还望指正! | | |
|
|
|
|
[第32楼]
[ 回复时间:2008-03-07 16:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-01-23 09:03 |
因为物理地址=段地址×16+偏移地址。乘16相当于左移一位,段地址为0时左移一位,偏移地址的范围就是在0-F时不会大物理地址00010,所以0-F是最小的段。和ip的网络段有多少台机器的分段相似, | | |
|
|
|
|
[第33楼]
[ 回复时间:2008-08-07 16:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-06-13 10:30 |
|
|
|
|
|
[第34楼]
[ 回复时间:2008-08-21 17:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-08-10 00:01 |
|
|
|
|
|
[第35楼]
[ 回复时间:2008-08-22 18:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-03 14:54 |
|
|
|
|
|
[第36楼]
[ 回复时间:2008-09-08 19:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-09-02 14:33 |
|
|
|
|
|
[第37楼]
[ 回复时间:2008-09-22 23:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2008-08-02 09:52 |
第20楼
反证法也通俗易懂,同样支持。
书本3.10 栈段 小节说的很很清楚。 | | |
|
|
|
|
[第38楼]
[ 回复时间:2008-10-26 19:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36 |
8086PC中 段最小为2B 与寄存器有关 硬件决定软环境
段=0 则段不是段
没有汽车零件的汽车还是汽车吗? | | |
|
|
|
|
[第39楼]
[ 回复时间:2008-10-26 19:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36 |
总结一下就是,如果一个段中有内容的话,那么这个段最小占16个字节的空间,如果没有内容,那么占的空间为0个字节。当然一个段最大就是64K个字节了。 19楼
有内容就是16b?这是编译器默认的,不是CPU。编译器不代表CPU.书上明确指出CPU不会把内存划分为段,段只是人为划分的 | | |
|
|
|
|
[第40楼]
[ 回复时间:2008-11-20 12:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-16 16:13 |
|
|
|
|
|
[第41楼]
[ 回复时间:2008-12-10 21:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-12-06 21:24 |
这个内容在第二章的测试题中,出现过,记得当时问的好像是代码段吧,其实这些段都一样,因为都是表示的内存地址,所以最小是16B. | | |
|
|
|
|
[第42楼]
[ 回复时间:2008-12-18 20:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10 |
|
|
|
|
|
[第43楼]
[ 回复时间:2008-12-22 22:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:5
注册日期:2008-12-18 16:07 |
3.5章的原话 “123B0H~123B9这段内存是一个数据段,它的段地址是123BH,长度为10个字节”
这个长度可以为10字节,那16字节最小杂解释?
大家可以去看下3.5章的内容 | | |
|
|
|
|
[第44楼]
[ 回复时间:2009-02-13 22:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-13 21:12 |
|
|
|
|
|
[第45楼]
[ 回复时间:2009-02-14 13:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
计算机内存寻址过程中,通过变化段地址或者偏移地址来找到相应物理内存。物理内存地址=段地址X10H+偏移地址。通过这个公式可以看出,如果不改变段地址,仅是通过变化偏移地址,偏移地址每增加1,可以寻找一个字节数据。所以给定段地址后,CPU可以寻找[段地址X10H + 0000]至[段地址X10H+FFFF]区间的物理内存,这一段的物理内存正好是64KB。也就是说给定段地址,CPU仅通过变化偏移地址,最大可以查找64KB内存。如果多于64KB内存,就需要变化段地址。而段地址每增加1,就相当于物理内存地址向后移动16字节。所以大家总是说段地址是16的倍数,这个倍数是针对物理地址来说。如段地址为0,偏移地址为0,就是指在物理地址为0位置,而段地址由零变为1。就意味在物理地址中向后移动16个字节的位置,即跨跃了16个字节。而在计算机表示段地址或者物理地址或者偏移地址都为整数。所以一个段地址最小可以从0开始,向后顺序加1的方式增加。每增加一次相当于跨过物理地址的16个字节。
============================================ | | |
|
|
|
|
[第46楼]
[ 回复时间:2009-02-19 18:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-19 16:39 |
|
|
|
|
|
[第47楼]
[ 回复时间:2009-03-26 16:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-03-20 22:14 |
最小为16个字节
------------------
回复:卡,正解 | | |
|
|
|
|
[第48楼]
[ 回复时间:2009-03-27 02:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-16 22:48 |
段的大小应该可以为0,否则如何解释3.2(2)的答案———
mov ax,1000H mov ss,ax mov sp,0H
sp初始值为0,则栈段的大小也就是0了 | | |
|
|
|
|
[第49楼]
[ 回复时间:2009-03-27 03:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-16 22:48 |
想了一下,应该是搞错了,依课本的看法,sp=0表明的是64K栈段
不过这样一来,却证明了0K栈段的不存在,因为要使0K栈段存在,必须sp=0,然而sp=0时,却表明这是一个64K段…………
从这点出发,假如8byte栈段存在,则其存在的物理位置必然在栈段的起始地址所在的单元(因为它只占一个单元的位置),此时,sp=0,于是,这又是一个64K段………… | | |
|
|
|
|
[第50楼]
[ 回复时间:2009-03-29 01:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:0
注册日期:2007-11-01 20:24 |
这个问题就是没有意义的问题。什么叫段最小??最小就是没有。
楼上所说的16byte,是指当段地址改变时,最小有多少地址空过去了。 | | |
|
|
|
|
[第51楼]
[ 回复时间:2009-04-20 14:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-20 09:42 |
|
|
|
|
|
[第52楼]
[ 回复时间:2009-04-20 14:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-20 09:42 |
一个地址字单元16字节。分8个高位单元和8个低位单元。所以最小是16。 | | |
|
|
|
|
[第53楼]
[ 回复时间:2009-04-21 15:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-21 14:54 |
64是2^16,而16是2^4,所以一个段最小到16个字节以后就可以是另一个段的开始了。 | | |
|
|
|
|
[第54楼]
[ 回复时间:2009-04-23 13:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2009-04-20 20:16 |
19楼说得很好,值得提倡的学习方法
我觉得如果不做实验,那说明你对2.7节还没搞懂,可以分两条路来解释
0~64K表示给偏移地址的范围
而16B说明的是一旦在内存空间中申请了一个段,除非是空,如果不是空就是以16B位最小单位的倍数递增申请的,这是由段地址*16决定的,内存空间认为如果要申请下一个段空间的时候,段地址*16=基础地址,基础地址十六进制中最后为一定是0,所以前后两个段空间之间间隔最小是16B,不管作为程序员你是不是全用完了自己申请的空间,内存空间都为你分配了16B倍数的空间,我也用一个程序来说明(根据19楼第2个程序基础,适当改变下,来说明)
-----------------------------------------
assume cs:code, ds:data
data segment
db 1 ;这里把19楼的db 0改了,这里请不要用中文说明,自己在编译时候可以删除我的说明
data ends
code segment
start: mov ax, data
mov ds, ax
mov bx, cs
sub ax, bx
code ends
end start
---------------------------------------
用debug 编译后执行文件后
-r
AX=0000 BX=0000 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1405 ES=1405 SS=1415 CS=1416 IP=0000 NV UP EI PL NZ NA PO NC
1416:0000 B81514 MOV AX,1415
-u
1416:0000 B81514 MOV AX,1415
1416:0003 8ED8 MOV DS,AX
1416:0005 8CCB MOV BX,CS
1416:0007 2BC3 SUB AX,BX
1416:0009 F8 CLC
1416:000A FF76F6 PUSH [BP-0A]
1416:000D B8D205 MOV AX,05D2
1416:0010 50 PUSH AX
1416:0011 FF362421 PUSH [2124]
1416:0015 E81864 CALL 6430
1416:0018 83C408 ADD SP,+08
1416:001B C45E06 LES BX,[BP+06]
1416:001E 26 ES:
1416:001F 837F0600 CMP WORD PTR [BX+06],+00
-d 1415:0
1415:0000 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
------------------------------------------------------
从1416:0000 B81514 MOV AX,1415说明1415是data的段地址,而1416是code的段地址,并且从
-d 1415:0
1415:0000 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
说明我申请的db 1只用了一个字节,而后面的字节是内存空间自动把我申请的,使得满足了16B为最小单位 | | |
|
|
|
|
[第55楼]
[ 回复时间:2009-08-02 00:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-16 19:29 |
|
|
|
|
|
[第56楼]
[ 回复时间:2009-08-22 09:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-08-16 10:50 |
段是字单位,字节单位是8字节,字单位是16字节,所以最小的段是16字节 | | |