BIOS int 13H,AH=02(读取软盘)和堆栈段
Posted
技术标签:
【中文标题】BIOS int 13H,AH=02(读取软盘)和堆栈段【英文标题】:BIOS int 13H, AH=02 (to read floppy) and the stack segment 【发布时间】:2012-01-31 07:51:30 【问题描述】:如果我不初始化堆栈段,会发生什么?
在某些情况下会导致阅读错误吗?
【问题讨论】:
【参考方案1】:当您调用软件中断(或进行任何调用)时,您的堆栈段寄存器最好有一个有效值,因为int
(或call
)指令需要一个有效堆栈来存储返回地址到你的代码。此外,被调用的子例程通常期望有一个有效的堆栈,它可以在其中push
一些寄存器来完成它的工作。
事实上,你的堆栈段寄存器最好始终有一个有效值,否则一旦第一个周期性中断发生,一切都会崩溃和烧毁。
【讨论】:
谢谢~我明白初始化栈段的重要性了。什么是“第一次周期性中断发生”? 如果我不初始化堆栈段,我可以使用多大的堆栈?我可以为堆栈段设置多大? IBM PC 有一个周期性中断控制器芯片,它会定期产生硬件中断。 (大约每秒 50 次。)当其中一个中断发生时,必须有一个有效的堆栈,否则就会崩溃。这就是为什么我们总是在操作堆栈段寄存器或堆栈指针寄存器之前禁用中断 (cli
),然后再重新启用它们 (sti
)。
为了建立一个堆栈,你必须初始化堆栈段寄存器和堆栈指针寄存器。但通常情况下,当您的程序开始运行时,操作系统已经为您设置了一个堆栈,因此通常您不必设置自己的堆栈,这意味着您根本不需要担心整个问题。跨度>
堆栈应该足够大,以包含您在其中分配的任何变量,以及在程序运行时可能发生的中断的几百字节。如果我必须设置一个堆栈,我会给它几千字节。以上是关于BIOS int 13H,AH=02(读取软盘)和堆栈段的主要内容,如果未能解决你的问题,请参考以下文章
在引导加载程序中使用 int 13h ah=42h 读取 LBA 硬盘