帮助理解生成的汇编代码的一部分

时间:2010-03-05 14:24:42

标签: c++ assembly x86

有人能向我解释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 个答案:

答案 0 :(得分:3)

cmpl $0x0,-0x4(%esp); setg %al表示将-0x4(%esp)(代码中的floop_id)与0进行比较,如果 g reater,则将%al设置为1,或者否则为0。

test %al, %al这里没有做任何事情。我不知道为什么它在集会中。 (通常,test使用自身的值来获取值的符号(即零,正或负),但这里没有使用此结果。机会是,它是要做一个条件分支(实现循环),但看到你的循环是空的,它就被删除了。)

答案 1 :(得分:0)

您生成的汇编代码中没有循环(显然编译器决定不需要它),但它似乎包含该循环的一些松散的剩余部分。有些位将100加载到变量中,从中减去1,将其与0进行比较。但代码中没有实际的迭代。

试图在此找到任何逻辑是毫无意义的练习。显然,编译器决定删除整个循环。但为什么它留下了一些“碎片”并不清楚。我会说代码中留下的内容是无害的,但同时具有与初始化变量值相同的含义。

顺便说一下,无条件的jmp会导致什么?你的拆卸不清楚。它不是马上跳到7?