汇编代码到 C,C 代码中的参数是什么,这些参数将使汇编代码成为
Assembly Code to C, what are the arguments in the C code that will make the Assembly code
所以我刚刚注册了这个在线课程,这是我第一个作业的一部分,我已经找到了汇编代码中缺失的部分并且已经走到这一步了。
这是汇编代码:
0x08048394 <call1+0>: push %ebp
0x08048395 <call1+1>: mov %esp,%ebp
0x08048397 <call1+3>: sub [=10=]x10,%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 [=10=]x8,%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 源代码部分和函数的汇编,我们也可以推断出以下内容:
函数传递了 3 个参数,我们可以看到它引用了 0x8(%ebp)
、0xc(%ebp)
和 0x10(%ebp)
。这些参数的顺序是第一、第二和第三。
第一个参数(从ebp
偏移0x8
)用作索引,我们可以从中看到:
mov 0x8(%ebp),%edx
mov 0xc(%ebp),%ecx
mov (%ecx,%edx,4),%eax
其他两个参数(偏移量 0xc
和 0x10
)被视为指向数组的指针并使用第一个进行索引。
鉴于上述情况,代码的公平重构如下:
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;
}
This assembly code to me looks like it may just be swapping the values of the two arrays... Am I right, or completely off?
是的,这对我来说似乎是正确的。当然在现实中我们并不知道实际传递给函数的是什么,但是如果在 main
中进行的调用如下:
call1(some_index, a1, a2);
然后该函数接受 a1
、a2
和一些索引,并检查给定索引处 a1
的元素是否小于或等于 a2
在同一索引处。如果是,则第一个元素被第二个元素覆盖,否则第二个元素被第一个元素覆盖。在任何情况下,该函数都会返回最大元素的值。
请注意 我们实际上不知道传递的第一个参数是a1
还是a2
。它可以是任何一种方式,甚至可以是 a1 + something
和 a2 + something_else
。确切的参数是什么只能通过查看 main
!
的完整代码(C 或汇编)来确定
所以我刚刚注册了这个在线课程,这是我第一个作业的一部分,我已经找到了汇编代码中缺失的部分并且已经走到这一步了。
这是汇编代码:
0x08048394 <call1+0>: push %ebp
0x08048395 <call1+1>: mov %esp,%ebp
0x08048397 <call1+3>: sub [=10=]x10,%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 [=10=]x8,%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 源代码部分和函数的汇编,我们也可以推断出以下内容:
函数传递了 3 个参数,我们可以看到它引用了
0x8(%ebp)
、0xc(%ebp)
和0x10(%ebp)
。这些参数的顺序是第一、第二和第三。第一个参数(从
ebp
偏移0x8
)用作索引,我们可以从中看到:mov 0x8(%ebp),%edx mov 0xc(%ebp),%ecx mov (%ecx,%edx,4),%eax
其他两个参数(偏移量
0xc
和0x10
)被视为指向数组的指针并使用第一个进行索引。
鉴于上述情况,代码的公平重构如下:
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;
}
This assembly code to me looks like it may just be swapping the values of the two arrays... Am I right, or completely off?
是的,这对我来说似乎是正确的。当然在现实中我们并不知道实际传递给函数的是什么,但是如果在 main
中进行的调用如下:
call1(some_index, a1, a2);
然后该函数接受 a1
、a2
和一些索引,并检查给定索引处 a1
的元素是否小于或等于 a2
在同一索引处。如果是,则第一个元素被第二个元素覆盖,否则第二个元素被第一个元素覆盖。在任何情况下,该函数都会返回最大元素的值。
请注意 我们实际上不知道传递的第一个参数是a1
还是a2
。它可以是任何一种方式,甚至可以是 a1 + something
和 a2 + something_else
。确切的参数是什么只能通过查看 main
!