gpt4 book ai didi

assembly - ret、retn、retf - 如何使用它们

转载 作者:行者123 更新时间:2023-12-02 21:28:43 32 4
gpt4 key购买 nike

我有以下 asm 代码:​​

; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
_wWinMain@16 proc near

var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h

push ebp
mov ebp, esp
sub esp, 8
mov [ebp+var_4], 5
mov eax, [ebp+var_4]
add eax, 1
mov [ebp+var_8], eax
xor eax, eax
mov esp, ebp
pop ebp
retn 10h

据我所知,返回指令有 3 种类型:ret、retn 和 retf,意思是返回、返回近和返回远。它们允许一个可选参数 nBytes,我猜它是从定义的变量中弹出的字节数。什么时候应该使用 retn 或 retf 而不是 ret?如何计算可选参数 nBytes?

最佳答案

实际上只有两种不同的返回,retn(近返回)和retf(远返回)。当你只使用 ret 时,汇编器或编译器足够聪明,可以选择哪一个是必需的。近返回是跳转到现有代码段内,远返回是跳转到不同的代码段。在 Windows 上,您只有一个代码段,因此 ret 应该只是 retn 的助记符。单独的 retn 和 retf 指令让人回想起过去分段内存模型很常见的时代。现在运行的几乎所有 32 位 x86 系统都使用扁平的、非分段的内存模型。

不带参数的 Ret 将返回地址从堆栈中弹出并跳转到该地址。一些调用约定(如 __stdcall)指定被调用函数清理堆栈。在这种情况下,他们使用字节数调用 ret 来将这些参数从堆栈中弹出。这16个字节是winmain函数的参数。

关于assembly - ret、retn、retf - 如何使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1396909/

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