汇编语言的段的最大和最小

转自《汇编语言》论坛

这儿争论有什么意思,做个实验测试一下就可以了,最大是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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值