在有关.COM文件https://en.wikipedia.org/wiki/COM_file的wikpedia页面上,其内容为:
DOS中的.COM文件将所有x86段寄存器设置为相同的值,而SP(堆栈指针)寄存器设置为0xFFFE,因此,堆栈从内存段的最顶部开始,并从那里开始向下工作。
但这实际上将堆栈设置为在该段的顶部下方开始一个单词。当将值压入堆栈时,CPU会将SP递减至0xFFFC并将其存储在该值中,从而浪费了该段的最高字。DOS不将SP设置为0的原因是什么?
在有关.COM文件https://en.wikipedia.org/wiki/COM_file的wikpedia页面上,其内容为:
DOS中的.COM文件将所有x86段寄存器设置为相同的值,而SP(堆栈指针)寄存器设置为0xFFFE,因此,堆栈从内存段的最顶部开始,并从那里开始向下工作。
但这实际上将堆栈设置为在该段的顶部下方开始一个单词。当将值压入堆栈时,CPU会将SP递减至0xFFFC并将其存储在该值中,从而浪费了该段的最高字。DOS不将SP设置为0的原因是什么?
Answers:
在CP / M中,您可以简单地使用来从程序中返回,ret
并且程序可以干净地退出。这是通过0x0000
在堆栈的顶部具有a 并int 20h
在address上具有一条指令来实现的0x0000
。尽管int 20h
DOS是退出程序的官方方式,但使用call 0
CP / M保留了退出程序的选项,并且最外面的作用域也ret
一样,因为它返回0
。
为了使该0x0000
单词位于堆栈的顶部,显然,您需要将可用的堆栈再往下2个字节开始。这就是为什么SP
最初在0xFFFE
指向该0x0000
单词的原因,而该单词又指向int 20h
指令。
int 20h
此处存储了指向指令的指针,因此您可以通过发出ret
指令来退出程序。