这是一段关于汇编代码的作业。我不确定我是否完全理解它。这是 5 个 switch 语句之一,我必须在其中编写等效的 C 代码。是我不明白这里发生了什么,还是有很多不必要的代码?
参数 p1 存储在 %ebp+8,参数 p2 存储在 %ebp+12。结果被初始化为 -1 并存储在 %edx 中。 .L19:设置返回值。
当我追踪它时,我的理解是 p1 被放入 %eax 中。然后将 %eax 指向的地址(即 p1 的值)放入 %edx。然后最后 4 行是不必要的,因为返回寄存器没有触及开关的其余部分。
movl 8(%ebp), %eax
movl (%eax), %edx
movl 12(%ebp), ecx
movl (%ecx), %eax
movl 8(%ebp), %ecx
movl %eax, (%ecx)
jmp .L19
我的书只是想变得狡猾,还是我完全没有捕获重点?谢谢。
最佳答案
为什么结果存储在%edx
中?我熟悉的 x86 中的调用约定都使用 %eax
作为整数/指针值的返回值。
我不认为你真的离得很远:
movl 8(%ebp), %eax
movl (%eax), %edx
这大概是这样的:
int value = *p1;
然后:
movl 12(%ebp), %ecx
movl (%ecx), %eax
看起来像:
int value2 = *p2;
然后最后:
movl 8(%ebp), %ecx)
movl %eax, (%ecx)
jmp .L19
相当于:
*p1 = value2;
break;
总结:
int value = *p1;
int value2 = *p2;
*p1 = value2
break;
呵呵。这一定是一个常见的家庭作业问题或在线 MOOC 之类的。查看:C, Assembly : understanding the switch condition, edx eax ecx
取自这个,看起来你在谈论MODE_A
:
int switchmode(int *p1, int *p2, mode_t action)
{
int result = 0;
switch(action) {
case MODE_A:
result = *p1;
*p1 = *p2;
break;
case MODE_B:
*p2 += *p1;
result = *p2;
break;
case MODE_C:
*p2 = 15;
result = *p1;
break;
case MODE_D:
*p2 = *p1;
/* Fall Through */
case MODE_E:
result = 17;
break;
default:
result = -1;
}
return result;
}
顺便说一句,结果在最后被传输到 %eax
,就像人们期望的那样。
关于将 x86 汇编代码片段转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389906/