这个汇编指令有什么作用?

逆向工程 部件 C
2021-06-23 16:17:26
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 被采用并将 20 置于 rbp 以下,然后在我看来参数设置为每个其他如 x=y 和 y=x 但是最后第二个参数设置为 rax 然后添加到 edx 我相信这是第一个参数然后返回。这是正确的还是我离题了?

1个回答

是的,这似乎是正确的。等效的 C 代码如下所示:

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

使用索引的基于堆栈的存储rbp就是我们所说的本地存储我们可以给每个用户一个名字,以便更容易地看到发生了什么。让我们调用rbp-0x18local_arg1、rbp-0x20local_arg2 和rbp-0x4local_temp处的值通过调用约定rdi是函数的第一个参数,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