- 论坛徽章:
- 0
|
以前工作环境是用PowerPC,很少看x86的汇编,所以对它不太熟悉。今天测试一个效率问题随便看了一下,有一些疑问:
volatile unsigned int rVal;
volatile unsigned int wVal;
void Work(void)
{
wVal = rVal;
}
int main(int argc, char *argv[])
{
unsigned int i;
// unsigned int count = (2 == argc) ? atoi(argv[1]) : 10000;
unsigned int count = 0xffffffff;
for (i = 0; i < count; ++i)
{
work();
}
return 0;
}
|
编译方式(之所以用--inline-limit是因为我用的这个4.1.2缺省会把小函数展开):
gcc -O3 call_loop.c -o call_loop --inline-limit=0
|
编译结果:
08048360 <Work>:
8048360: 55 push %ebp
8048361: a1 78 95 04 08 mov 0x8049578,%eax
8048366: 89 e5 mov %esp,%ebp
8048368: 5d pop %ebp
8048369: a3 74 95 04 08 mov %eax,0x8049574
804836e: c3 ret
804836f: 90 nop
08048370 <main>:
8048370: 8d 4c 24 04 lea 0x4(%esp),%ecx
8048374: 83 e4 f0 and $0xfffffff0,%esp
8048377: ff 71 fc pushl 0xfffffffc(%ecx)
804837a: 55 push %ebp
804837b: 89 e5 mov %esp,%ebp
804837d: 53 push %ebx
804837e: 31 db xor %ebx,%ebx
8048380: 51 push %ecx
8048381: 83 c3 01 add $0x1,%ebx
8048384: e8 d7 ff ff ff call 8048360 <Work>
8048389: 83 fb ff cmp $0xffffffff,%ebx
804838c: 75 f3 jne 8048381 <main+0x11>
804838e: 59 pop %ecx
804838f: 31 c0 xor %eax,%eax
8048391: 5b pop %ebx
8048392: 5d pop %ebp
8048393: 8d 61 fc lea 0xfffffffc(%ecx),%esp
8048396: c3 ret
8048397: 90 nop
8048398: 90 nop
8048399: 90 nop
804839a: 90 nop
804839b: 90 nop
804839c: 90 nop
804839d: 90 nop
804839e: 90 nop
804839f: 90 nop
|
我感到不太理解的是:
1. Work中没有任何栈变量访问,从指令操作看实在想不出把ebp压栈、修改然后再恢复有什么意义?
2. main函数中对于esp的只在为什么要先加上一个4压到栈里面,然后恢复到ecx再减去个4?
另外用gdb调试时如果直接用b main则断点并不是加在函数入口的第一条指令上,而是0x804837e上。
试过用-O3编译,没什么区别。
[ 本帖最后由 Cyberman.Wu 于 2008-6-5 09:00 编辑 ] |
|