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