汇编八

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之间的空间


汇编八_第1张图片
栈帧

参数过多的情况:

汇编八_第2张图片
分析此代码汇编过程

汇编八_第3张图片
01

汇编八_第4张图片
02

汇编八_第5张图片
03

汇编八_第6张图片
04

汇编八_第7张图片
05

基地址和偏移地址:

汇编八_第8张图片
执行指令的时候,ip先+1,再去执行
汇编八_第9张图片
无论怎么执行,偏移地址都有一样

汇编八_第10张图片
传说中的基址

数据对应的地址是不会变:偏移地址

汇编八_第11张图片
内存1
汇编八_第12张图片
内存2

有待补充。。。。。。

汇编八_第13张图片
判断条件的判断
汇编八_第14张图片
标记寄存器,条件判断

以上

你可能感兴趣的:(汇编八)