汇编八
2017-07-22 本文已影响38人
Flonger
swift中去掉了自增自减符号(++,--)
- 原因:
- ++:
DEBUG:
int a = 10;
++a;
int c = a;
/*
0x100c2074b <+27>: movl $0xa, -0x14(%rbp)
0x100c20752 <+34>: movl -0x14(%rbp), %edi
0x100c20755 <+37>: addl $0x1, %edi
0x100c20758 <+40>: movl %edi, -0x14(%rbp)
-> 0x100c2075b <+43>: movl -0x14(%rbp), %edi
0x100c2075e <+46>: movl %edi, -0x18(%rbp)
*/
int a = 10;
int b = ++a + ++a + ++a; //面试题 没答案 看cpu、编译器
/*
0x10ed8473b <+27>: movl $0xa, -0x14(%rbp) ;a = 10
-> 0x10ed84742 <+34>: movl -0x14(%rbp), %edi ;di = 10
0x10ed84745 <+37>: addl $0x1, %edi ;di = 10 + 1 = 11
0x10ed84748 <+40>: movl %edi, -0x14(%rbp) ;a = 11
0x10ed8474b <+43>: movl -0x14(%rbp), %ecx ;cx = 11
0x10ed8474e <+46>: addl $0x1, %ecx ;cx = 11 + 1 = 12
0x10ed84751 <+49>: movl %ecx, -0x14(%rbp) ;a = 12
0x10ed84754 <+52>: addl %ecx, %edi ;di = 12 + 11 = 23
0x10ed84756 <+54>: movl -0x14(%rbp), %ecx ;cx = 12
0x10ed84759 <+57>: addl $0x1, %ecx ;cx = 13
0x10ed8475c <+60>: movl %ecx, -0x14(%rbp) ;a = 13
0x10ed8475f <+63>: addl %ecx, %edi ;di = 23 + 13 = 36
0x10ed84761 <+65>: movl %edi, -0x18(%rbp) ;b = 36
*/
- +=:
int a = 10;
a+=1;
int c = a;
/*
0x10810874b <+27>: movl $0xa, -0x14(%rbp)
0x108108752 <+34>: movl -0x14(%rbp), %edi
0x108108755 <+37>: addl $0x1, %edi
0x108108758 <+40>: movl %edi, -0x14(%rbp)
-> 0x10810875b <+43>: movl -0x14(%rbp), %edi
0x10810875e <+46>: movl %edi, -0x18(%rbp)
*/
OC: Release模式下:
- Xcode 函数可以优化,但是方法不可以优化。
- 方法全是运行时。
一个函数内部不在调用其他函数的话,直接调用bp-n,这块区域叫做红色区域(不改变sp,快)
- 红色区域默认区域大小:128字节
- 当红色区域不够用的话,照样会sp - n。
栈帧:
一个函数调用时候sp和bp之间的空间
栈帧
参数过多的情况:
分析此代码汇编过程01
02
03
04
05
基地址和偏移地址:
执行指令的时候,ip先+1,再去执行 无论怎么执行,偏移地址都有一样传说中的基址