当前位置: 首页 > 知识库问答 >
问题:

在x86 asm中调用之前使用此mov的目的是什么?

卫宁
2023-03-14

我只是在学习ASM/x86,请耐心听我说。

我在我正在检查的程序中注意到以下内容,我认为它正在向被调用的函数传递一个参数:

mov   [ebp-04],00000005
call  <some function call here>

据我所知,这似乎是将堆栈顶部的第二个字节设置为值5

这是否有效地将参数5传递给函数?

它是否类似于C中的以下内容:

void someFunction(int num); //function declaration

someFunction(5); //In some context

如果将单个参数5传递给函数,为什么将其设置为第二个字节(-04),而不是堆栈顶部?堆栈顶部是什么?我对这一切的解释都错了吗?

编辑函数顶部是设置ebp的位置:

push  ebp
mov   ebp,esp
push  -01
push  184
mov   eax,fs:[00000000]
...   //bunch more pushes and movs with eax and ecx into [ebp-offset]
...   //a couple of jump if equals
...   //some more push and movs
lea   ecx,[ebp-1C]
mov   [ebp-04],00000005
call  <some function>

这是被调用的函数:

 mov   edx,[ecx]
 mov   eax,[ecx+08]
 sub   eax,edx
 test  edx,edx
 je    <label1>
 cmp   eax,00000080
 jna   <label2>
 push  edx
 call  <another function>
 add   esp,04
 ret
label2:
 push  eax
 push  edx
 call  <yet another function>
 add   esp,08
label1:
 ret

共有3个答案

奚才良
2023-03-14

通常通过将参数放入寄存器或将其推送到堆栈上,然后调用目标子例程来传递参数。

EBP通常包含指向堆栈帧的指针,而不是堆栈顶部。所以你的例子看起来很奇怪,至少看起来不太可能是一个参数传递操作。它可能是与正在进行调用的函数相关的一些其他操作。

它是编译器生成的代码吗?如果是这样,编译器可能知道ESP和EBP之间的关系(通常在输入函数ESP被复制到ESP中时),并可能利用这些知识。您需要尽早确定正在使用的EBP值的设置位置;展示这段代码会很有帮助。

鲜于煜祺
2023-03-14

ebp不是堆栈指针,即esp

此外,在不知道函数本身的情况下,可能无法判断它是局部参数还是函数参数:

int x = 5;
foo();

可以生成与foo(5)相同的代码

帧指针用于指向当前函数的堆栈区域的开头,必须由函数本身在序言中设置。参数在它上面(正偏移量),局部变量在它下面(负偏移量)。请注意,在32位和64位模式下(在x86上),您实际上并不需要它,因为您可以直接相对于堆栈指针esp进行寻址。不过,在某些情况下,它可能是有用的,例如用于调试目的。

荆弘伟
2023-03-14

您展示的示例不是向函数传递值。至少这不是一个典型的通话。

fs寄存器的使用通常是try/cat设置。

如果这真的是函数的整个序列(尤其是被调用的函数),那么

... 在这里,它可能只是设置了一些局部变量。

mov   [ebp-04],00000005

...这里似乎有一个参数要在ECX寄存器中传递

lea   ecx,[ebp-1C]

大多数编译程序使用ebp寄存器作为堆栈上局部变量的基指针。然后用[ebp-X]寻址单个变量,其中X是每个变量的偏移量。例如,如果您有两个本地int变量,那么当这两个变量被寻址时,您将看到[ebp-4][ebp-8]

 类似资料:
  • 正如Translation Django文档的本节所述,函数ugettext_noop是一个用于国际化的实用函数:

  • 本文向大家介绍系统调用的目的是什么?,包括了系统调用的目的是什么?的使用技巧和注意事项,需要的朋友参考一下 进程和操作系统之间的接口由系统调用提供。通常,系统调用可用作汇编语言说明。它们也包含在汇编级程序员使用的手册中。通常在用户模式下的进程需要访问资源时进行系统调用。然后,它请求内核通过系统调用提供资源。 通常,在以下情况下需要系统调用- 如果文件系统需要创建或删除文件。从文件读取和写入也需要系

  • 我以前做过这件事,但忘记了,无法在网上轻易找到答案。 我应该用什么类型填写?

  • 问题内容: 在Python中执行块之前冒号的目的是什么? 例: 问题答案: 冒号用于声明缩进块的开始。 从技术上讲,这是没有必要的;您可以在程序段完成后缩进和缩进。但是,基于Python koan的 “显式胜于隐式”(EIBTI),我相信Guido故意使冒号成为强制性的,因此, 任何 应 在缩进代码后跟随的语句均以冒号结尾。(如果您继续在冒号后面继续,它还允许单线,但是这种样式并未得到广泛使用。)

  • 问题内容: 我想了解和的声明之间的区别。特别是方括号部分的目的是什么?什么时候使用它们,什么时候不使用? 问题答案: 它使AngularJS代码最小化。AngularJS使用参数名称将值注入到控制器函数中。在JavaScript压缩过程中,这些参数被重命名为较短的字符串。通过使用字符串数组告诉哪些参数被注入到函数中,当重命名参数时,AngularJS仍然可以注入正确的值。

  • 我一直在SO和GitHub上寻找一种方便的方法来搜索我的RecolyerView。 我找到了这个项目:Searchable RecolyerView 对于这个ItemExampleBinding对象,它在任何地方都没有提到,在SO上没有提到,在GitHub上也没有提到,在项目主页上也没有提到。 你们中有没有人以前使用过这个库,并且能够向我解释这个对象是什么,以及如何创建它? 提前谢谢你。