Понимание сборки против C аналога - PullRequest
0 голосов
/ 02 февраля 2019

Учитывая этот ассемблерный код, у меня возникли проблемы с переводом ассемблерного кода в его эквивалентный код C.

   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 ______;
       }
    }

1 Ответ

0 голосов
/ 02 февраля 2019

возникают проблемы с определением того, какие значения хранятся в каком регистре, чтобы я мог отслеживать команды.

Запуск за пределами цикла.

0xff = 255, поэтому R9mask.

GCC выводит 7 из цикла и выполняет 7-i с mov %r10d, %edi / sub %edx, %edi, поэтому мы знаем, что в этот момент m = EDI.(И это r10d просто содержит 7, а не x, потому что есть также movabs, чтобы инициировать другой регистр.)

Единственная другая переменная инициализации вне цикла, которая не учитываетсяравно x, поэтому RSI = x.

Это продолжается оттуда.От отслеживания m оно продолжается оттуда.

...