gpt4 book ai didi

assembly - 调用函数后内核出现三重错误

转载 作者:行者123 更新时间:2023-12-02 10:51:45 25 4
gpt4 key购买 nike

我有两个函数在内核中运行,函数 A 和函数 B。函数 A 清除屏幕并将控制权传递给函数 B(当前不执行任何操作)。当控制返回到功能 A 时,会发生三重故障。 (这是 x86 Intel 语法)

<小时/>

函数A

function_a:
pop edx
push ebp
mov ebp, esp
sub esp, 8
push dword 0
pop eax
mov [ebp-4], eax
jmp .il_15
.il_7:
push dword 753664
mov eax, [ebp-4]
push eax
pop eax
pop ebx
add eax, ebx
push eax
push dword 0
pop eax
pop ebx
mov [ebx],al
mov eax, [ebp-4]
push eax
push dword 1
pop eax
pop ebx
add eax, ebx
push eax
pop eax
mov [ebp-4], eax
.il_15:
mov eax, [ebp-4]
push eax
push dword 4000
pop eax
pop ebx
cmp ebx, eax
jl .il_7
push dword 4
call function_b
jmp .methodend
.methodend:
add esp, 8
pop ebp
push edx
ret
<小时/>

函数B

function_b:
pop edx
push ebp
mov ebp, esp
sub esp, 4
jmp .methodend ;This is just an empty function
.methodend:
add esp, 4
pop ebp
push edx
ret
<小时/>

我很确定我已经为每个函数正确设置了堆栈(pop 返回值、push ebp 等),所以我不确定导致崩溃的原因

最佳答案

function_bfunction_a 中似乎没有任何内容可以清理在调用 function_b 之前压入堆栈的单词:

push dword 4
call function_b

此外,function_b 会丢弃用于存储 function_a 返回地址的 edx

我不确定为什么这些函数具有将返回地址弹出到 edx 中的模式,以便可以在返回之前将其推回 - 为什么不将返回地址留在堆栈上共?如果您不想这样做,那么您需要在调用 function_b 之前保存 edx (可能通过将其压入堆栈)并在之后恢复它。

关于assembly - 调用函数后内核出现三重错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com