汇编八

作者: Flonger | 来源:发表于2017-07-22 01:06 被阅读38次

    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,再去执行 无论怎么执行,偏移地址都有一样
    传说中的基址

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

    内存1 内存2

    有待补充。。。。。。

    判断条件的判断 标记寄存器,条件判断

    以上

    相关文章

      网友评论

          本文标题:汇编八

          本文链接:https://www.haomeiwen.com/subject/ffkykxtx.html