汇编八

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模式下:

一个函数内部不在调用其他函数的话,直接调用bp-n,这块区域叫做红色区域(不改变sp,快)

栈帧:

一个函数调用时候sp和bp之间的空间


栈帧

参数过多的情况:

分析此代码汇编过程
01
02
03
04
05

基地址和偏移地址:

执行指令的时候,ip先+1,再去执行 无论怎么执行,偏移地址都有一样
传说中的基址

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

内存1 内存2

有待补充。。。。。。

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

以上

上一篇下一篇

猜你喜欢

热点阅读