nad*_*der 10 x86 assembly callstack dos x86-16
在关于 .COM 文件的维基百科页面https://en.wikipedia.org/wiki/COM_file 上,它写道:
DOS 中的 .COM 文件将所有 x86 段寄存器设置为相同的值,并将 SP(堆栈指针)寄存器设置为 0xFFFE,因此堆栈从内存段的最顶部开始并从那里开始工作。
但这实际上将堆栈设置为在段顶部下方开始一个单词。当将一个值压入堆栈时,CPU 会将 SP 递减到 0xFFFC 并将该值存储在那里,从而浪费了段的顶部字。DOS 没有将 SP 设置为 0 的原因是什么?
Che*_*yDT 16
在 CP/M 中,您可以简单地从程序中使用返回,ret并且您的程序将干净地退出。这是通过0x0000在堆栈顶部设置 a并int 20h在 address 处设置指令来实现的0x0000。尽管int 20h是 DOS 退出程序的官方方式,使用退出程序的选项call 0保留在 CP/M 中,并且最外层范围的ret工作方式也相同,因为它返回到0.
0x0000显然,为了使该字位于堆栈顶部,您需要进一步向下启动可用堆栈 2 个字节。这就是为什么SP最初是 at 0xFFFE,指向那个0x0000词,而这个词又指向int 20h指令。
| 归档时间: |
|
| 查看次数: |
525 次 |
| 最近记录: |