Помогите понять часть этого сгенерированного кода сборки - PullRequest
1 голос
/ 05 марта 2010

Может кто-нибудь объяснить мне сборку, сгенерированную GCC из следующих кодов C ++?в частности, значение setg и test в кодах.thx!

.cpp коды:

 1   /*for loop*/

 2   int main()

 3   { 
 4      int floop_id;

 5      for(floop_id=100;floop_id>=1;floop_id--)
 6      {}
 7      return 0;
 8   }

монтажные коды:

 3      push %ebp               
 3      mov  %esp, %ebp         
 3      sub  $0x10,%esp         
 5      movl $0x64,-0x4(%ebp)   
 5      jmp  8048457<main+0x13> 
 5      subl $0x1,-0x4(%esp)    
 5      cmpl $0x0,-0x4(%esp)    
 5      setg %al                
 5      test %al, %al           
 7      mov  $0x0,%eax          
 8      leave                   
 8      ret 

Ответы [ 2 ]

3 голосов
/ 05 марта 2010

cmpl $0x0,-0x4(%esp); setg %al означает сравнение -0x4(%esp) (floop_id в вашем коде) с 0 и установите %al на 1, если это g reater, или 0 в противном случае.

test %al, %al здесь ничего не делает.Я не знаю, почему это в сборке.(Обычно test использование значения с самим собой используется для получения знака значения (т. Е. Ноль, положительный или отрицательный), но результат этого здесь не используется. Скорее всего, он собиралсявыполнить условную ветвь (для реализации цикла), но, поскольку ваш цикл пуст, он был удален.)

0 голосов
/ 05 марта 2010

Ваш сгенерированный ассемблерный код не содержит цикл (очевидно, компилятор решил, что он не нужен), но, похоже, он содержит некоторые свободные остатки этого цикла. Есть биты, которые загружают 100 в переменную, вычитают 1 из нее, сравнивают ее с 0. Но в коде нет фактической итерации.

Попытка найти какую-то логику в этом - бессмысленное упражнение. Компилятор, очевидно, решил удалить весь цикл. Но почему это оставило некоторый "мусор" позади, не ясно. Я бы сказал, что то, что осталось в коде, безвредно, но в то же время имеет такое же значение, как и значение инициализированной переменной.

Кстати, куда ведет безусловный jmp? Это не понятно из вашей разборки. Разве он не прыгает сразу на 7?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...