【发布时间】:2021-07-18 03:24:12
【问题描述】:
所以我刚刚注册了这个在线课程,这是我第一次作业的一部分,我已经在汇编代码中找到了缺失的部分并且已经走到了这一步。
这是汇编代码:
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,%edx,4),%esi
0x080483b0 <call1+28>: cmp %esi,%eax
0x080483b2 <call1+30>: jle 0x80483b9 <call1+37>
0x080483b4 <call1+32>: mov %eax,(%ebx,%edx,4)
0x080483b7 <call1+35>: jmp 0x80483be <call1+42>
0x080483b9 <call1+37>: mov %esi,(%ecx,%edx,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 代码 sn-p 中的哪些参数会导致上面的汇编代码:
int main(){
int a1[] = {10, 12, 3, 4, 25};
int a2[] = {9, 28, 7, 16, 5};
call1(_________________________________);
}
我认为它只是 a1 和 a2,但我不确定这就是我需要帮助的原因。 在我看来,这个汇编代码可能只是在交换两个数组的值...... 我是对的,还是完全不对?
【问题讨论】:
-
没有弄清楚整个事情,但你有 3 个相对于
(%ebp)的正偏移量,所以我想说那个函数有三个参数。 -
该函数似乎也有一个返回值设置为
call+40。eax被分配了一些东西。 -
这个问题的格式不正确:“以下 C 代码 sn-p 中的哪些参数会导致上面的汇编代码?” - 任何参数都会导致该代码.那是函数本身的代码,无论你传递什么参数,它总是一样的。如果你想弄清楚传递了哪些参数,你需要查看调用者的汇编代码(
main)! -
可悲的事实是,您无法从这个 asm 源中分辨出来。您需要编码
main。你可以做出明智的猜测,但仅此而已。比如,两个参数显然是指针,你可以猜到它们可能是a1和a2,但你不知道哪个是哪个,它们也可以是a1 + 3之类的东西,甚至完全不相关。代码中也没有循环,所以它显然没有处理整个数组。您还可以看到第一个参数用作索引但您不知道值。 -
阅读这篇描述 C 调用约定要求调用者和被调用者做特定事情的文章你可能会有所收获:en.wikipedia.org/wiki/X86_calling_conventions