微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

汇编代码到 C,C 代码中的哪些参数将使汇编代码

如何解决汇编代码到 C,C 代码中的哪些参数将使汇编代码

所以我刚刚注册了这个在线课程,这是我第一个任务的一部分,我已经找到了汇编代码中的缺失部分,并且已经到了这一步。

这是汇编代码

0x08048394 <call1+0>:  push   %ebp
0x08048395 <call1+1>:  mov    %esp,%ebp
0x08048397 <call1+3>:  sub    $0x10,%esp
0x0804839a <call1+6>:  mov    %ebx,(%esp)
0x0804839d <call1+9>:  mov    %esi,0x4(%esp)
0x080483a1 <call1+13>: mov    0x8(%ebp),%edx
0x080483a4 <call1+16>: mov    0xc(%ebp),%ecx
0x080483a7 <call1+19>: mov    (%ecx,%edx,4),%eax
0x080483aa <call1+22>: mov    0x10(%ebp),%ebx
0x080483ad <call1+25>: mov    (%ebx,%esi
0x080483b0 <call1+28>: cmp    %esi,%eax
0x080483b2 <call1+30>: jle    0x80483b9 <call1+37>
0x080483b4 <call1+32>: mov    %eax,(%ebx,4)
0x080483b7 <call1+35>: jmp    0x80483be <call1+42>
0x080483b9 <call1+37>: mov    %esi,(%ecx,4)
0x080483bc <call1+40>: mov    %esi,%eax
0x080483be <call1+42>: pop    %ebx
0x080483bf <call1+43>: pop    %esi
0x080483c0 <call1+44>: add    $0x8,%esp
0x080483c3 <call1+47>: leave
0x080483c4 <call1+48>: ret

我的问题是,以下 C 代码片段中的哪些参数会导致上述汇编代码

int main(){

int a1[] = {10,12,3,4,25};

int a2[] = {9,28,7,16,5};

call1(_________________________________);

}

我认为它只是 a1 和 a2,但我不确定这就是我需要帮助的原因。 这个汇编代码在我看来可能只是交换了两个数组的值...... 我是对的,还是完全不对?

解决方法

正如我在上面的评论中所说,这个问题格式不正确:“以下 C 代码片段中的哪些参数会导致上述汇编代码?” - 任何参数都会导致该问题代码。那是函数本身的代码,无论您传递给它什么参数,它都将始终相同。如果要弄清楚传递了哪些参数,则需要查看调用方的汇编代码(main)。

然而,即使没有 main 的完整代码,有了你拥有的 C 源代码的一部分和函数的汇编,我们可以推断出以下内容:

  1. 该函数传递了 3 个参数,我们可以看到它引用了 0x8(%ebp)0xc(%ebp)0x10(%ebp)。这些参数依次为第一、第二和第三。

  2. 第一个参数(offset 0x8 from ebp)被用作索引,我们可以从:

    mov    0x8(%ebp),%edx
    mov    0xc(%ebp),%ecx
    mov    (%ecx,%edx,4),%eax
    
  3. 另外两个参数(偏移量 0xc0x10)被视为指向数组的指针,并以第一个作为索引。

鉴于上述情况,代码的公平重构如下:

int call1(int index,int *a1,int *a2) {
    int eax,esi;

    eax = a1[index];
    esi = a2[index];

    if (eax <= esi) {
        a1[index] = esi;
        eax = esi;
    } else {
        a2[index] = eax;
    }

    return eax;
}

这个汇编代码在我看来可能只是交换了两个数组的值......我是对的,还是完全没有?

是的,这对我来说似乎是正确的。当然实际上我们不知道实际传递给函数的是什么,但如果在 main 中进行的调用如下:

call1(some_index,a1,a2);

然后函数取a1a2和一些索引,并检查给定索引处a1的元素是否小于或等于{{1}的元素}} 在同一个索引。如果是,则第一个元素会被第二个元素覆盖,否则第二个元素会被第一个元素覆盖。在任何情况下,该函数都返回最大元素的值。

请注意我们实际上不知道传递的第一个参数是 a2 还是 a1。它可以是任何一种方式,也可以是 a2a1 + something。确切的参数是什么只能通过查看 a2 + something_else!

的完整代码(C 或汇编)来确定

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。