将x86汇编代码片段转换为C语言

时间:2014-10-15 18:48:52

标签: c assembly x86

这是汇编代码的一项任务。我不确定我是否抓住了它。这是5个switch语句中的一个,我必须编写等效的C代码。是不是我不理解这里发生了什么,还是有很多不必要的代码?

参数p1存储在%ebp + 8,参数p2存储在%ebp + 12。结果初始化为-1并存储在%edx中。 .L19:设置返回值。

当我追踪它时,我的理解是p1被放入%eax。然后%eax指向的地址(p1' s值)被放入%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

我的书只是试图变得棘手还是我完全错过了这里的标记?感谢。

1 个答案:

答案 0 :(得分:2)

为什么结果存储在%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,就像人们期望的那样。