Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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_X86 - Fatal编程技术网

Assembly 它是汇编中的正确代码吗

Assembly 它是汇编中的正确代码吗,assembly,x86,Assembly,X86,我不熟悉汇编,也不了解如何在x86中调用约定 在下面的一个例子中 cdecl int MyFunction1(int a, int b) { return a + b; } x = MyFunction1(2, 3); _MyFunction1: push ebp mov ebp, esp mov eax, [ebp + 8] mov edx, [ebp + 12] add eax, edx pop ebp ret push 3 push 2 call _MyFunction1 a

我不熟悉汇编,也不了解如何在x86中调用约定

在下面的一个例子中

cdecl int MyFunction1(int a, int b)
{
 return a + b;
}


 x = MyFunction1(2, 3);


_MyFunction1:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret

push 3
push 2
call _MyFunction1
add esp, 8
我能够理解给定代码的大部分内容,但对pop ebp已经完成的一行有疑问


我认为正确的调用应该是“pop[ebp+4]”,因为在推ebp之后,执行mov ebp,esp,导致ebp指针减4,因此要达到原始位置,必须向ebp添加4个字节。

典型的尾声如下:

mov esp, ebp
pop ebp
ret
旧ebp存储在当前ebp指向的地址。因此
mov-esp,ebp
将堆栈指针放在该地址,因此
pop-ebp
将正确恢复ebp(和esp)

恰好您可以放弃函数中的
mov-esp,ebp
指令,因为您从未使用堆栈,并且ebp和esp已经指向同一地址


pop[ebp+4]
是不正确的,因为这会将堆栈顶部的值放入
[ebp+4]

典型的尾声如下:

mov esp, ebp
pop ebp
ret
push ebp
la la la la la la la la la la 
pop ebp
ret
旧ebp存储在当前ebp指向的地址。因此
mov-esp,ebp
将堆栈指针放在该地址,因此
pop-ebp
将正确恢复ebp(和esp)

恰好您可以放弃函数中的
mov-esp,ebp
指令,因为您从未使用堆栈,并且ebp和esp已经指向同一地址

pop[ebp+4]
不正确,因为这会将堆栈顶部的值放入
[ebp+4]

push ebp
la la la la la la la la la la 
pop ebp
ret
所以很好

一键

一炮

所以很好

一键


一个pop

xen-0答案是正确的,但你甚至不需要完整的开场白/尾声(你的身体中没有使用堆栈指令,因此不需要用mov还原esp)。通常,只有在开场白xen-0答案正确的情况下,你才需要mov,但是你甚至不需要完整的开场白/尾声(你没有在身体里使用堆栈指令,所以不需要用mov还原esp)。一般来说,你通常只需要在开场白中用一个子为本地人腾出空间时才需要mov。我甚至不认为pop[ebp+4]在x86汇编中是合法的。。如果我没有错的话,这是两种间接(内存)访问。我认为是一样的,我的原始答案也反映了这一点,但谷歌搜索结果和一个快速测试表明并非如此。pop[ebp+4]从[esp]读取一个值,然后将其写入内存中的地址[ebp+4]。它不同于从[esp]读取值并将其写入寄存器ebp的“pop ebp”。我甚至不认为pop[ebp+4]在x86汇编中是合法的。。如果我没有错的话,这是两种间接(内存)访问。我认为是一样的,我的原始答案也反映了这一点,但谷歌搜索结果和一个快速测试表明并非如此。pop[ebp+4]从[esp]读取一个值,然后将其写入内存中的地址[ebp+4]。它不同于从[esp]读取值并将其写入寄存器ebp的“pop ebp”。