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

标签 c assembly x86

这是一段关于汇编代码的作业。我不确定我是否完全理解它。这是 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/

相关文章:

c - 告诉 C 内联函数但仍然可以调用调试器

c 中带有信号量的关键部分

assembly - 如果许多编程语言前端的编译器后端相同,那么不同语言的编译目标代码是否相同?

c - 汇编代码转C代码(添加指令问题)

c++ - 声明具有不同返回值的 extern "C"

assembly - "conditional call"在 amd64 上的性能

c - sys_break 有什么作用?

使用 .C() : random value is the same every time 从 R 调用 C 代码

c - 为什么在 C99 之前禁止混合声明和代码?

debugging - 谁能清楚地解释一下这个拆解吗?