上面代码逻辑很清楚了,循环根据条件修改pf变量,而pf会读取到eax寄存器,然后通过call *%eax进行函数调用,那么如果在call *%eax处内联函数,则根本没法解决到底内联fn1还是fn2的问题。
在gcc O3下生成的汇编如下:
main.o: file format pe-i386 Disassembly of section .text: 00000000 <__Z3fn1v>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: c9 leave 4: c3 ret 5: 8d 76 00 lea 0x0(%esi),%esi 00000008 <__Z3fn2v>: 8: 55 push %ebp 9: 89 e5 mov %esp,%ebp b: c9 leave c: c3 ret d: 8d 76 00 lea 0x0(%esi),%esi 00000010 <_main>: 10: 55 push %ebp 11: 89 e5 mov %esp,%ebp 13: 83 e4 f0 and $0xfffffff0,%esp 16: 53 push %ebx 17: 83 ec 0c sub $0xc,%esp 1a: e8 00 00 00 00 call 1f <_main+0xf> 1f: 31 db xor %ebx,%ebx //ebx清零 21: b8 08 00 00 00 mov $0x8,%eax //函数fn2地址赋予eax 26: 66 90 xchg %ax,%ax //2字节无用指令对齐地址位(追求4整数地址)?不太确定 28: ff d0 call *%eax //调用fn2 2a: 43 inc %ebx //i++ 2b: 81 fb e8 03 00 00 cmp $0x3e8,%ebx //判断循环,ebx充当i 31: 74 15 je 48 <_main+0x38> //相等结束循环 33: 83 fb 14 cmp $0x14,%ebx //i和20比较 36: 7f 18 jg 50 <_main+0x40> //i>20跳转到50 38: b8 08 00 00 00 mov $0x8,%eax //函数fn2地址赋予eax 3d: ff d0 call *%eax //调用fn2 3f: 43 inc %ebx 40: 81 fb e8 03 00 00 cmp $0x3e8,%ebx 46: 75 eb jne 33 <_main+0x23> 48: 31 c0 xor %eax,%eax 4a: 83 0c add $0xc,%esp 4d: 5b pop %ebx 4e: c9 leave 4f: c3 ret 50: b8 00 00 00 00 mov $0x0,%eax ////函数fn1地址赋予eax 55: eb d1 jmp 28 <_main+0x18> 57: 90 nop
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-34432-2.html
实际情况根本不是这样也永远不会这样
就是之前一直荒废着的鬼城的空房子
网友们需要些理智与耐心
它越找你