4、全局变量 & 循环选择和判断

首先我们先来简单的回忆一下内存分区:

  • 代码区:存放代码,可读,可执行。

  • 栈区:参数、局部变量、临时数据。

  • 堆区:动态申请,可读、可写。

  • 全局区:全局变量,可读、可写。

  • 常量区:只读。

  • 常量区 & 全局区
    首先我们来看下面的代码:

    WX20210329-103103.png

    test对应的汇编代码如下:
    WX20210329-103447.png

  • 通过上图,我们得知,在我们汇编代码的断点位置:
    ix0寄存器里面存放的是,常量Aaron的地址值。
    ii地址值里面存放的是ASCII码。
    那么问题来了:这个地址值是怎么来的?
    其实通过逻辑推理不难判断,此时x0里面的值是通过下面这两条指令获得的:

0x1021ea0f8 <+16>: adrp   x0, 1
0x1021ea0fc <+20>: add    x0, x0, #0xf85            ; =0xf85 

下面我们来解释一下这两条指令:

0x1021ea0f8 <+16>: adrp   x0, 1
这句指令的意思是:
①:将`1`左移`12位`, 得到的结果是:`1000`(注意一个字节是4位)
②:将`pc`寄存器里面的值的后12位清零,然后加上上面的结果,得到的结果是:`0x1021eb000`
此时`x0`的值是`0x1021eb000`

0x1040f60fc <+20>: add    x0, x0, #0xf85
这句指令的意思是:
①:将`x0`与`0xf85`相加
②:将相加的结果再存入`x0`
最终`x0`的值是`0x1021ebf85`

这样就得到了我们的字符串常量Aaron
其实我们的全局变量g也是这样获得的:

WX20210329-105213.png

讲到这里,可能就有人要问了,adrp指令里面的1/7这些又是什么意思呢?其实1就代表4K,怎么来的呢?
首先我们说了:
adrp1要左移12位,就是1000
那么这3个0换成F就是FFF,正好是40950~40954096个数,正好是4K

  • tips:
    MacOS(M1除外)中,内存的一页是4KiOS中一页是16K。这个我们也可以通过终端指令来看一下:

循环选择和判断

首先我们先来认识一个新的指令:cmp(Compare)比较指令

  • CMP一个寄存器的内存另一个寄存器的内存立即数进行比较。但是不存储结果,只是正确的更改标志。
    其实就是进行减法,但是不影响当前寄存器内容,只是修改标记寄存器
    一般CMP做完判断后会进行跳转,后面通常会跟上B指令⚠️ 。
  • bl标号:跳转到标号处执行。
  • b.gt标号:比较结果是大于(greater than),执行标号,否则不跳转。
  • b.ge标号:比较结果是大于等于(greater than or equal to),执行标号,否则不跳转。
  • b.eq标号:比较结果是等于,执行标号,否则不跳转。
  • b.hi标号:比较结果是无符号大于,执行标号,否则不跳转。
    接下来我们借助另一个工具Hopper来查看汇编代码,为反汇编做准备。

  • if else
    有这么一段代码,编译之后将可执行文件拖入Hopper中查看(注意这里我们是用真机编译的,ARM64)


w8 & w9存储的就是我们的a & b,这里就不不做过多的分析。
注意:我们代码中写的是if(a >b)cmp做减法的结果如果是非正数就跳转至:loc_100006100;如果是正数,就接着往下执行。

  • 如果是非正数,则loc_100006100代码块执行完毕之后,会直接进入loc_100006108代码块。()
  • 如果是正数,则继续执行接下来的代码块,然后通过b指令,跳转到loc_100006108代码块。

这就是if else指令的汇编体现。同时我们又认识了一个新的指令:b.le(小于等于)。
再认识一个:b.lt(小于)


  • loop(循环)
  • 首先我们来看一下doWhile


    可以看到,doWhile的汇编指令,先执行do,然后根据b.lt指令进行跳转或者继续执行。
  • while
  • for (int i = 0; i < 100; i++)


可以发现,普通的for循环的汇编指令跟while没有什么区别。

注意 ⚠️ :for in的汇编代码就要复杂很多,有兴趣的同学可以自己编译查看一下。


  • Swith
    ⚠️ 注意:此时我们只写了3个判断,并且还是连续的


    可以看到,当判断条件在3个及以内的时候,switch的汇编实现就是if else
    我们再来添加一个case:
case 4:
   printf("1");
   break;


我们会发下,当判断条件大于3个的时候,swith的汇编代码就变了,不再是之前的if else。这就是swith底层优化,如果判断条件大于3个的时候,就会创建一个表,表里面存储了每一个case对应的要执行的代码的地址。只要去查表就可以了。(当然,前提条件是,判断条件是连续的有规律的(或者差值不是很大的)。)

下面我们看一下无序的switch:

switch (a) {
        case 0:
            printf("1");
            break;
        case 10:
            printf("1");
            break;
        case 2:
            printf("1");
            break;
        case 40:
            printf("1");
            break;
        default:
            break;
    }


会发现,此时switch又变成了if else

我们在使用switch的时候,要注意case的数量,以及case的规律,这样才能提高代码的质量。

这里我们只是简单的探讨了一下switch,后续我们会针对switch做一下更深入的研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容