这是什么汇编指令?


0
push %rbp 
mov %rsp,%rbp 
mov %rdi,-0x18(%rbp) 
mov %rsi,-0x20(%rbp) 
mov -0x18(%rbp),%rax 
mov (%rax),%eax 
mov %eax,-0x4(%rbp) 
mov -0x20(%rbp),%rax 
mov (%rax),%edx 
mov -0x18(%rbp),%rax 
mov %edx,(%rax) 
mov -0x20(%rbp),%rax 
mov -0x4(%rbp),%edx 
mov %edx,(%rax) 
mov -0x18(%rbp),%rax 
mov (%rax),%edx 
mov -0x20(%rbp),%rax 
mov (%rax),%eax 
add %edx,%eax 
pop %rbp 
retq 

我只是在寻找某人来确认我的想法,我所看到的情况是参数1被采取并且放在18以下rbp和参数2被采取并且放在rbp以下20然后在我看来,参数是相互设置的,如x = y和y = x,但最后第二个参数设置为rax,然后添加到edx,我相信它是第一个参数,然后返回。这是正确的还是我的方式?

2

是的,这似乎是正确的。等效的C代码看起来是这样的:

int func(int *arg1, int *arg2) 
{ 
    int temp = *arg1; 
    *arg1 = *arg2; 
    *arg2 = temp; 
    return *arg1 + *arg2; 
} 

使用索引断开的rbp基于堆栈的存储就是我们俗称的local storage。我们可以给每个用户一个名称,以便更容易地看到发生了什么。我们把它叫做rbp-0x18 local_arg1,rbp-0x20 local_arg2和rbp-0x4 local_temp。通过calling conventionrdi是函数的第一个参数,rsi是第二个参数。

添加注释,其中指针引用发生,拆装然后

push %rbp 
mov %rsp,%rbp   
mov %rdi,local_arg1 
mov %rsi,local_arg2 
mov local_arg1,%rax 
mov (%rax),%eax  ; dereference the pointer i.e. eax = *arg1 
mov %eax,local_temp 
mov local_arg2,%rax 
mov (%rax),%edx  ; edx = *arg2 
mov local_arg1,%rax 
mov %edx,(%rax)  ; *arg1 = edx 
mov local_arg2,%rax 
mov local_temp,%edx 
mov %edx,(%rax)  ; *arg2 = edx 
mov local_arg1,%rax 
mov (%rax),%edx  ; edx = *arg1 
mov local_arg2,%rax 
mov (%rax),%eax  ; eax = *arg2 
add %edx,%eax 
pop %rbp 
retq 
+1

真棒,你怎么知道他们是指针,而不仅仅是整数? 09 12月. 172017-12-09 07:23:50

  0

是因为(%rbp)vs%rbp说明值? 09 12月. 172017-12-09 07:24:57

  0

我更新了答案以更好地解释这一点。 09 12月. 172017-12-09 15:58:21

  0

非常感谢你! 12 12月. 172017-12-12 05:49:49

  0

你是如何将你的C代码反编译成汇编语言的,反之亦然? 16 12月. 172017-12-16 07:58:32

  0

没有工具,我只是根据我编译器生成的经验创建了C代码,反汇编非常简单,所以对于正在发生的事情非常容易。任何好的反编译工具都应该产生类似于我放下的东西。 16 12月. 172017-12-16 09:02:51