Hud*_*den 3 boot x86 assembly bios bootloader
我正在编写一个引导加载程序,我正在遵循的教程提供了以下代码:
main:
;----------------------------------------------------
; code located at 0000:7C00, adjust segment registers
;----------------------------------------------------
cli ; disable interrupts
mov ax, 0x07C0 ; setup registers to point to our segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
;----------------------------------------------------
; create stack
;----------------------------------------------------
mov ax, 0x0000 ; set the stack
mov ss, ax
mov sp, 0xFFFF
sti ; restore interrupts
Run Code Online (Sandbox Code Playgroud)
我可能误解了一些东西但是如果SS寄存器包含0x0000则不意味着ds,es,fs和gs会重叠堆栈吗?还有fs和gs寄存器的功能是什么?此外,BIOS是否自动设置了cs段?因为它表示代码位于0000:7c00.此外,本教程永远不会解释为什么禁用中断.我在某处读到通常禁用中断以避免死锁.这是什么意思,为什么会发生?
至少在理论上,是的,堆栈和代码可能重叠.它们之所以不那么简单:引导加载程序非常小,并且通常不会占用很多堆栈空间,因此堆栈永远不会向下扩展到足以覆盖引导加载程序代码的末尾.
就fs和gs而言,它们并没有真正的专用.在没有查看有问题的引导加载程序的代码的情况下,可以开始质疑它们是否被使用.如果它们被使用,它是开放的,以更的问题是什么,他们会被使用的.
磁盘BIOS将磁盘中的扇区加载到07c00:0000h,然后远程跳转到它.跳远设置cs
.
您在设置堆栈时禁用中断,因为执行中断(尝试)将数据推送到堆栈.如果你还没有设置堆栈(SS和SP),你通常甚至不知道内存中数据(标志和返回地址)可能结束的位置,或者它可能覆盖的其他数据.这通常是不受欢迎的,因此至少在SS和SP都设置之前禁用中断.
归档时间: |
|
查看次数: |
1785 次 |
最近记录: |