3

例如,给定以下 ARM 汇编代码,是否有任何直接的方法可以使用任何适当的变量名将其直接转换为 C?

      ADD $2  $0  #9
      ADD $3  $0  #3
      ADD $1  $0  $0
loop: ADD $1  $1  #1
      ADD $3  $0  $3, LSL #1
      SUB $2  $2  $1
      CMP $2  $1  
      BNE loop

另外,由于我还在学习 ARM,循环将执行多少次,比如 SUB 或 ADD?有没有直接的方法来确定这一点?

谢谢您的帮助!任何其他不是特别旨在回答这个问题的见解也很好。

4

2 回答 2

3

简而言之,BNE-Branch Not Equal 可以建议一个do{...}while循环或其他方式while (...){...},甚至可能是一个for( ...; ... < ....; ...){...}循环,这是它可以走的最远的地方。

至于从某些寄存器中读取加法/减法(读取,C 上下文中的内存变量),您将不得不通过读取它来玩,并想出一个几乎等价的东西。

在这个阶段,反编译器可能对你没有帮助,使用几个 C 代码来练习并使用-S传递给 C 编译器的命令参数将其编译为汇编语言,看看你得到了什么,恐怕主要是反复试验,也就是说,如果您正在寻找上述问题中该代码的确切副本。

于 2013-01-20T23:22:19.610 回答
1
unsigned int r0,r1,r2,r3;

r2=r0+9;
r3=r0+3;
r1=r0+r0;
do 
{
  r1=r1+1;
  r3=r0+(r3<<1);
  r2=r2-r1;
} while(r2!=r1);

不知道 r0 在循环中发生了什么可能会发生几次或多次(比如数百万?数十亿?) r2 正在减少,r1 正在增加,如果它们在第一次通过时不与等于碰撞,它们将不得不滚动。每个循环 r1 都会变大,因此 r2 会更快地变小。应该很容易为 r0 添加 printf 和一些测试值,看看会发生什么。

例如,在输入此代码之前,r0 是 0。r2 是 r0+9 = 9;并且 r1 是双 r0,即 0。

第一个这么多循环会像这样使用四个变量 r0,r1,r2,r3

00000000 00000001 00000008 00000006
00000000 00000002 00000007 0000000C
00000000 00000003 00000006 00000018
00000000 00000004 00000005 00000030
00000000 00000005 00000004 00000060
00000000 00000006 00000003 000000C0
00000000 00000007 00000002 00000180
00000000 00000008 00000001 00000300
00000000 00000009 00000000 00000600
00000000 0000000A FFFFFFFF 00000C00
00000000 0000000B FFFFFFFE 00001800

r2 和 r1 不会发生碰撞。

但如果 r0 是 1 则

00000001 00000003 00000009 00000009
00000001 00000004 00000008 00000013
00000001 00000005 00000007 00000027
00000001 00000006 00000006 0000004F

r0 = 3

00000003 00000007 0000000B 0000000F
00000003 00000008 0000000A 00000021
00000003 00000009 00000009 00000045

到目前为止,r0 必须是奇数。但是当您将 r0 设为 9 时

00000009 00000013 00000011 00000021
00000009 00000014 00000010 0000004B
00000009 00000015 0000000F 0000009F
00000009 00000016 0000000E 00000147
00000009 00000017 0000000D 00000297
00000009 00000018 0000000C 00000537
00000009 00000019 0000000B 00000A77
00000009 0000001A 0000000A 000014F7
00000009 0000001B 00000009 000029F7
00000009 0000001C 00000008 000053F7
00000009 0000001D 00000007 0000A7F7
00000009 0000001E 00000006 00014FF7
00000009 0000001F 00000005 00029FF7
00000009 00000020 00000004 00053FF7
00000009 00000021 00000003 000A7FF7
00000009 00000022 00000002 0014FFF7
00000009 00000023 00000001 0029FFF7
00000009 00000024 00000000 0053FFF7
00000009 00000025 FFFFFFFF 00A7FFF7
00000009 00000026 FFFFFFFE 014FFFF7

基本上它对某些规则有点确定性,但如果比较没有发生,那么循环可能会永远运行或至少运行很多个循环。

于 2013-01-20T23:56:34.843 回答