【问题标题】:Nios II assembly code to CNios II 汇编代码到 C
【发布时间】:2015-04-15 15:21:13
【问题描述】:

我正在尝试用 C 编写下面的代码,但我在这样做时遇到了一个真正的问题,所以如果有人能帮助我并同时向我解释,我将不胜感激。

array .word ? 
mystery: 
  add r2,r0,r0
  addi r7,r0,32
loop: 
  movia r4, array
  slli r3,r2,2
  add r5,r3,r4
  ldw r14, (r5)
  add r15, r3, r14
  stw r0, (r15) 
  addi r2, r2, 1
  bge r7,r2,loop
  ret 

【问题讨论】:

  • 你应该问一个更具体的问题。见stackoverflow.com/help/how-to-ask
  • 为什么不具体?代码在 ASSEMBLY 中,我必须用 C 编写它
  • 我假设这是一个名为“mystery”的函数,但函数的参数应该在 r4-r7 中传递。然而,这里的情况似乎并非如此。 r0 值的假设是什么?它是写入前唯一使用的寄存器。这个函数应该有返回值吗?约定是返回 r2-r3 中的值。基本上我们需要了解这里使用的调用约定才能翻译成 C。
  • 寄存器 r0 包含零,我没有调用代码。没错,寄存器 r4-r7 用于传递参数,而寄存器 r2 用于返回值。第一行怎么样?有人知道它的用途吗?

标签: c assembly reverse-engineering nios


【解决方案1】:

我不相信array .word ? 是正确的语法。我认为这只是表示位置数组中有一个一定大小的数组。这是翻译:

int *array[];
void mystery () {
    int r2;
    int *r14;
    for (r2 = 0; r2 <= 32; r2++) {
        r14 = array[r2];
        r14[r2] = 0;
    }
}

【讨论】:

  • ldw r14, (r5) = *r14 ?是因为 (r5) 旁边什么都没有吗?你能解释一下吗?
  • ldw 将 r5 指向的值加载到 r14 中。 r5 中的地址是字节地址,但是里面的项是一个字。 r5 是通过获取数组地址并添加 4 倍的偏移量(即 r2)来创建的。那 4 次片段用于创建字地址而不是字节地址。 C 在数组操作中自动为您执行此操作。这样就变成了'r14 = array[r2]'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多