为什么在加载.COM文件后DOS将SP寄存器设置为0xFFFE?


10

在有关.COM文件https://en.wikipedia.org/wiki/COM_file的wikpedia页面上,其内容为:

DOS中的.COM文件将所有x86段寄存器设置为相同的值,而SP(堆栈指针)寄存器设置为0xFFFE,因此,堆栈从内存段的最顶部开始,并从那里开始向下工作。

但这实际上将堆栈设置为在该段的顶部下方开始一个单词。当将值压入堆栈时,CPU会将SP递减至0xFFFC并将其存储在该值中,从而浪费了该段的最高字。DOS不将SP设置为0的原因是什么?


6
DOS在int 20h此处存储了指向指令的指针,因此您可以通过发出ret指令来退出程序。
FUZ

Answers:


16

这是为了与CP / M兼容。

在CP / M中,您可以简单地使用来从程序中返回,ret并且程序可以干净地退出。这是通过0x0000在堆栈的顶部具有a 并int 20h在address上具有一条指令来实现的0x0000。尽管int 20hDOS是退出程序的官方方式,但使用call 0CP / M保留了退出程序的选项,并且最外面的作用域也ret一样,因为它返回0

为了使该0x0000单词位于堆栈的顶部,显然,您需要将可用的堆栈再往下2个字节开始。这就是为什么SP最初在0xFFFE指向该0x0000单词的原因,而该单词又指向int 20h指令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.