首先说明以下的内容都是摸索出来的,不敢说一定正确,有不对的地方还请指正。
我在学习汇编的过程中一直不明白操作系统是如何分段的和如何将一个段地址赋给寄存器(如有个段data segment 那么 mov ax,data 是如何实现的)经过查找资料和摸索基本了解了其中原理,记录如下:
首先看如何分段,比如有如下代码
data segment
db ‘data’
data ends
我最初的理解是:当程序运行时在获得这个分段的信息后,会自动在内存中查找一段长为64K的未使用空间给这个段使用。我以为一个段固定必须是64K,并且不一定会被分配到内存的哪个地方。后来在实践中发现我的理解是错误的。
事实是:一个段最大占用空间为64K,而最小分配的空间是16个字节,并且总以16的倍数来分配空间。(如果段里面没有定义任何数据则不分配空间)
如上面你那个段在代码中分配的空间如下图所示:
那么如果程序中有多个段呢:
data segment
db ‘data’
data ends
data2 segment
db ‘data2’
data2 ends
data3 segment
db ‘da