《汇编语言》第六章主要讲述“如何编写包含多个段的汇编源程序”。本章的文字内容不多,主要通过编程实践来理解汇编源程序架构的含义,通篇学下来,我觉得有以下几点需要理解清楚:
1,这里所说的多个段(segment),从汇编“程序”的角度来说,它指的是程序所占用的内存空间的划分,大致分为:data segment、stack segment和code segment。其实际就是指定运行时CPU的DS、SS和CS这三个寄存器的值。
2,但是,从源程序的角度来看,它指的是代码的组织方式。源程序分成多个段,是的代码的层次更清晰。
3,我们通常讲的多个段,更多的还是从源程序的角度来说的。事实上,一个段的源程序,通过设置CPU的寄存器也可以划分程序的内存空间。
4,汇编语言通过在源程序中使用段名(name)来标记各个段。
5,源程序中的段名(name)和标号(label),它们本质上都代表一个地址。在debug下反汇编,我们可以看到,段名和标号都被它们代码的地址值替代了。
6,不同的是,段名代表的是段地址(SA),标号代表的是偏移地址(EA)。
7,源程序通过“end+label”指定入口地址(entry),当然,这个入口地址仅仅是偏移地址。默认为0。
8,这个入口地址的信息被记录在.exe的描述信息中,对应“PSP(程序段前缀)”。
9,程序加载的时候,CS由系统指定(或者说由加载程序指定,shell);加载程序会搜索PSP,根据其中的entry,设置IP的值,默认为0。
10