转自《汇编语言》论坛
这儿争论有什么意思,做个实验测试一下就可以了,最大是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个字节了。
=====================================
如果不到16字节,对其到16,多于16且不是倍数,对其到倍数,如19对其到32