有了这个汇编代码,我很难将汇编代码转换成等效的C代码。

c - 了解Assembly与C对等-LMLPHP

   int main() {
      long int x=______;
      long int mask=0xff;
      int i,n,m;
      for(i=0;i<______;i++) {
         n=i;
         m=7-i;
         long int n8=n<<3;
         long int m8= m<<3;
         long int n_mask=mask<<n8;
         long int m_mask=mask<<m8;
         long int n_byte=((______>>n8) & ______;
         long int left_over = ______;
         x=left_over ______;
       }
    }


我能够推断出一些简单的空白,但是不确定如何找出其余的空白。

当前尝试:

   int main() {
      long int x=7;
      long int mask=0xff;
      int i,n,m;
      for(i=0;i<4;i++) {
         n=i;
         m=7-i;
         long int n8=n<<3;
         long int m8= m<<3;
         long int n_mask=mask<<n8;
         long int m_mask=mask<<m8;
         long int n_byte=((______>>n8) & ______;
         long int left_over = ______;
         x=left_over ______;
       }
    }

最佳答案

无法弄清楚哪些值存储在哪个寄存器中,因此我可以跟踪命令。


从循环开始。

0xff = 255,因此R9为mask

GCC将7提升到循环之外,并对7-i / mov %r10d, %edi执行sub %edx, %edi,因此我们知道此时m = EDI。 (并且r10d只是保存7,而不是x,因为还有一个movabs可以初始化另一个注册表。)

循环外唯一无法解释的变量初始化是x,因此RSI = x。

它从那里继续。从跟踪m开始,从那里继续。

关于c - 了解Assembly与C对等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54489390/

10-12 16:00