Assembly 为什么这是EBP寄存器值?

Assembly 为什么这是EBP寄存器值?,assembly,x86,operating-system,paging,osdev,Assembly,X86,Operating System,Paging,Osdev,我目前正在开发操作系统 在分页过程中,我创建了一个页面错误处理程序 write_cr0 : push ebp mov ebp, esp mov eax, dword[ebp+8] mov cr0, eax pop ebp retn 在页面错误处理程序中,将cr0寄存器中的PG位设置为使用上面的write_cr0函数关闭或打开分页 它在进程#0(空闲进程)中无错误地执行。 但是 如果shell进程创建了一个新进程,并且出现页面错误, 弹出时,推送到堆栈上的EBP寄存器的值很奇怪。(0xffff

我目前正在开发操作系统

在分页过程中,我创建了一个页面错误处理程序

write_cr0 : 
push ebp
mov ebp, esp
mov eax, dword[ebp+8]
mov cr0, eax
pop ebp
retn
在页面错误处理程序中,将cr0寄存器中的PG位设置为使用上面的write_cr0函数关闭或打开分页

它在进程#0(空闲进程)中无错误地执行。 但是 如果shell进程创建了一个新进程,并且出现页面错误, 弹出时,推送到堆栈上的EBP寄存器的值很奇怪。(0xffffffff)


我真的不知道为什么。请告诉我解决方案。

推送的ebp值就是调用方中的值。如果调用方是页面错误处理程序,并且它没有使用ebp进行任何操作,那么它仍然具有页面错误发生之前的值。

奇怪为什么必须在页面错误处理程序内打开和关闭页面?这可能会导致一些严重的问题。您是否有理由认为0xFFFFFF值不正确?您是否能够向我们显示您的页面错误处理程序代码?推送时,它被放入0xc…,但当弹出时,它会弹出为0xFFFFFF。如果您关闭分页,可能esp的线性地址和物理地址不匹配。