对汇编程序中分段的理解

在8086处理器中包含各种段寄存器,如程序段寄存器cs、数据段寄存器ds、堆栈段寄存器ss等,这些寄存器分别存放着程序、数据和堆栈所在段的段地址,当取指令时,采用cs:ip进行寻址;当访问内存时,采用ds:[?]寻址;当进行堆栈操作时,采用ss:sp寻址,三者的实质都是指针。那为什么用3个而不是1个呢?答案当然是为了方便操作,虽然用一个也可以实现。

那么,为什么将一段程序的内容分为数据段、代码段和堆栈段呢?可不可以不分开而是放在一起?——在PC上可以,嵌入式系统上一般不行!原因如下:

PC中程序、数据和堆栈都存放在内存(RAM)中,即使三者混在一起也没关系,甚至相互穿插都行(当然堆栈不能被穿插),因为只要地址没错,程序流就不会乱序,同样,数据可以正确访问,堆栈可以正常使用。但嵌入式系统中,程序可以放在内存中也可以放在ROM中,但数据(全局变量)和堆栈必须放在内存(RAM)中才能正确进行访问(这里主要指能否正确执行对内存的修改)。当程序全部或部分存放在ROM中时,就必须将数据和堆栈挑出来放在内存中,因此通常将程序、数据和堆栈分成不同的段,以便于正确进行地址空间的安排。上面说到嵌入式系统“一般”不行,那什么时候“行”呢?——当全部程序都存放到RAM中运行的时候。

另外,即使是在PC上执行的程序,也最好进行分段而不要混在一起,这样便于在编写程序时定位数据所在的地址。

posted @ 2022-06-21 11:51  凉风SK  阅读(302)  评论(0编辑  收藏  举报