Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在具有局部变量时调用函数_Assembly - Fatal编程技术网

Assembly 在具有局部变量时调用函数

Assembly 在具有局部变量时调用函数,assembly,Assembly,我有一个函数,它有一些局部变量,它调用一个接受两个参数的不同函数。我是汇编新手,我不确定局部变量是否会把我的新函数堆栈搞砸。从技术上讲,它们不是和1和2的值一样在堆栈上吗?我稍后会推这些值?我是否必须将局部变量保存到其他地方,然后添加esp,4,然后推送1和2的值,从而从堆栈中除去局部变量 my_function: push ebp mov ebp, esp sub esp, 4 mov dword [ebp - 4], 10 push dword ptr 1 push dword ptr 2

我有一个函数,它有一些局部变量,它调用一个接受两个参数的不同函数。我是汇编新手,我不确定局部变量是否会把我的新函数堆栈搞砸。从技术上讲,它们不是和1和2的值一样在堆栈上吗?我稍后会推这些值?我是否必须将局部变量保存到其他地方,然后添加esp,4,然后推送1和2的值,从而从堆栈中除去局部变量

my_function:
push ebp
mov ebp, esp
sub esp, 4
mov dword [ebp - 4], 10
push dword ptr 1
push dword ptr 2
call other_function
mov esp, ebp
pop ebp

这就是堆栈的整个概念,这些本地项被推到堆栈上,堆栈指针被移动以为它们腾出空间,堆栈指针地址的下一个函数是它们开始在堆栈上放置内容的位置。不断地。当一个函数清理时,它会将堆栈指针放在它找到它的地方,这样之前的人就不会看到它发生了变化,他们可以引用自己的内部内容,然后将它放回原处

所以如果函数A添加了3个东西,调用了函数B添加了1个东西,调用了函数C添加了4个东西,那么函数C清除了4个东西并返回。B清理1件东西并返回。A清理3件东西并返回

向堆栈添加内容可以是对堆栈指针的简单数学修改(减法4),也可以是单独的推送指令(无论指令集使用什么)。同样,在返回时,根据要对堆栈数据执行的操作,您可以简单地修改指针以将其放回原处,也可以弹出一些内容,例如,要在函数期间保留先前状态的寄存器(及其所有同级)

以这个精心设计的函数为例

unsigned int more_fun (unsigned int x, unsigned int y);
unsigned int fun ( unsigned int x, unsigned int y )
{
    return(x+(y<<more_fun(x+3,y+4)));
}
unsigned int more\u fun(unsigned int x,unsigned int y);
无符号整数(无符号整数x,无符号整数y)
{

返回(x+(yYes,它们在堆栈上,不,它们不会破坏你调用的函数,因为它们比参数更远。那么其他函数可以从my_函数技术上访问我的局部变量吗?@Bobby是的,的确。局部变量不是特定于函数,因为它们在放置时不直接修改esp,而是直接修改副本a吗t ebp?另一个函数可以在某种意义上说,如果它超出其堆栈空间(易于组装)访问您和其他任何人的堆栈数据。他们可以访问esp+100并在其他一些函数数据中漫游。那么这是否意味着我的其他函数仍然可以通过访问esp-X访问在我的函数中创建的局部变量?esp+X但是的(对于向下增长的堆栈,向下意味着在堆栈上推送内容时,地址变小)调用您的函数可以使用esp-X,只要它们在其他函数覆盖该数据之前使用esp-X,我现在就明白了。因此,本质上,我必须在长嵌套函数调用期间以及基本上在任何时候跟踪当前堆栈指针的位置以及每个值/变量在堆栈上的位置,以便能够使用/引用是的,堆栈框架使这更容易,注意你是如何拥有ebp和esp的,你保存ebp,之前的函数堆栈框架,然后你在函数中使用ebp引用函数中的项,你在开始时移动esp一次,在堆栈上为你的函数分配空间,然后在结束时撤销它一次。这活动必须通过推送和砰砰声全程跟踪。
00000000 <fun>:
   0:   e92d4070    push    {r4, r5, r6, lr}
   4:   e1a04000    mov r4, r0
   8:   e1a05001    mov r5, r1
   c:   e2800003    add r0, r0, #3
  10:   e2811004    add r1, r1, #4
  14:   ebfffffe    bl  0 <more_fun>
  18:   e0840015    add r0, r4, r5, lsl r0
  1c:   e8bd4070    pop {r4, r5, r6, lr}
  20:   e12fff1e    bx  lr