【问题标题】:Converting a snippit of x86 Assembly Code into C将 x86 汇编代码片段转换为 C
【发布时间】:2014-12-10 23:08:48
【问题描述】:

这是一篇关于汇编代码的作业。我不确定我是否完全掌握它。这是我必须编写等效 C 代码的 5 个 switch 语句之一。只是我不明白这里发生了什么,还是有很多不必要的代码?

参数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

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

【问题讨论】:

  • *p1 => %edx; *p1=(*p2) ;

标签: c assembly x86


【解决方案1】:

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

【讨论】:

  • 我的描述可能有点不正确。这是交换机中的一个案例。还有 4 个类似的案例,它们的代码对我来说似乎根本没有用。另外 %edx 是结果值,而不是返回值。但是,.19: 有一行:movl %edx, %eax。所以我仍然看不到最后几行代码的使用。谢谢。
  • 设置指针绝对是“一种使用”。究竟是什么,如果不花时间阅读其余代码(例如我链接的),我不确定,但绝对不是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2014-09-01
  • 2020-11-04
  • 2011-05-04
  • 2013-02-17
  • 2013-01-22
  • 2013-04-15
相关资源
最近更新 更多