Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在引导加载程序启动时读取堆栈是否安全? 背景_Assembly_X86_X86 16_Bootloader_Stack Pointer - Fatal编程技术网

Assembly 在引导加载程序启动时读取堆栈是否安全? 背景

Assembly 在引导加载程序启动时读取堆栈是否安全? 背景,assembly,x86,x86-16,bootloader,stack-pointer,Assembly,X86,X86 16,Bootloader,Stack Pointer,我正在尝试制作一个适用于两种体系结构的引导加载程序:x86和PDP-11。主操作系统是为兼容PDP-11的机器编写的,但是从x86启动也应该可以,启动模拟器 好的,如果最后两个字节是0x55 0xaa,x86将第一个磁盘扇区加载到0x7c00,并跳到那里。相反,PDP-11兼容机器将第一个扇区加载到0o20000(八进制),如果第一个命令是NOP,最后两个字节是0xaa 0x55,则执行该扇区。但是,由于某些硬件细节,加载的数据实际上是反向的——例如,x86将读取0x12,而另一台机器将读取0x

我正在尝试制作一个适用于两种体系结构的引导加载程序:x86和PDP-11。主操作系统是为兼容PDP-11的机器编写的,但是从x86启动也应该可以,启动模拟器

好的,如果最后两个字节是
0x55 0xaa
,x86将第一个磁盘扇区加载到
0x7c00
,并跳到那里。相反,PDP-11兼容机器将第一个扇区加载到
0o20000
(八进制),如果第一个命令是
NOP
,最后两个字节是
0xaa 0x55
,则执行该扇区。但是,由于某些硬件细节,加载的数据实际上是反向的——例如,x86将读取
0x12
,而另一台机器将读取
0xed
。这在某种程度上是本文中的一个特性,因为如果我将最后两个字节设置为
0x55 0xaa
,它们将适用于两台机器

总之,PDP-11兼容机器要求前两个字节包含
NOP
命令,即
0o000240
0x00a0
。数据是反向的,因此x86实际上将读取
0xff5f

问题
0x5f
是x86中的实际命令。不幸的是,它是
popdi
。AFAIK,
sp
ss
值都未指定,因此此命令读取谁知道是什么

我的问题是:

  • 在实践中,我可以假设它们要么指向有效堆栈,要么都设置为某个占位符,例如
    0x0000:0x0000
    0xffff:0xffff
  • 是否可以
    ss:sp
    指向不安全读取的内存映射硬件寄存器?如果是的话,如果我阅读它们,会发生什么更糟糕的事情
  • 可能
    ss:sp
    指向不可用内存,即可能
    pop di
    触发总线错误?如果是,BIOS将如何从中恢复,即它将重新启动、显示消息或执行其他操作

在进入引导加载程序时,至少在SS:SP下面使用少量堆栈空间是安全的。它将被包括键盘在内的中断异步使用;实模式没有单独的内核堆栈。(IIRC,当固件跳转到传统BIOS MBR引导扇区的代码时,会启用中断。)但x86会向下扩展堆栈,因此在读取
[sp]
处的值后,实际上执行
sp+=2
。如果初始堆栈位于引导扇区正下方,则SP将指向尚未执行的指令。或者它包装了SP。不过,我不认为错误。
ss:SP=0x0000:0x7c00
案例是一个有效的观点,但我恐怕无法修复它——将
cli
作为第二条指令,即使可能,也无法修复问题。还有其他用户更熟悉x86 BIOS引导,可以更好地解决问题。我不确定初始的SS:SP是否在
0000:7c00
的正下方是常见的,但我想我看到有人说有时会这样做。表示堆栈可以位于RAM中的任何位置。请注意,PC引导扇区末尾的
0x55 0xaa
字节仅在从硬盘(以及模拟为硬盘的东西)引导时才需要存在。从软盘启动时(以及模拟为软盘的东西)不需要它。