iOS

汇编初探

2021-03-28  本文已影响0人  Summit_yp

内存分区
代码区:存放代码,可读可执行(macho文件中代码段在这里)
栈区:参数,局部变量,临时数据
堆区:动态申请,可读可写(例如新创建一个对象)
全局变量:可读可写
常量区:只读

汇编指令
sub :减
add:加
str:写入数据
ldr:读取数据
adrp(address page):以页寻址。

0x1047c2188 : adrp x0,1 
1.将1左移12位变为 0x1000
2.将pc寄存器低12位清零0x1047c2000并加上0x1000为0x1047c3000 
3.将0x1047c3000放入x0

cmp:比较指令,把一个寄存器的内容和另外一个寄存器的内容或立即数进行比较。但不存储结果,只是正确的更改标志,一般cmp做完判断后通常会跟上b指令

bl 标号:跳转到标号处执行(标号即地址)
b.gt 标号:比较结果为大于 跳转执行标号 否则不跳转
b.ge 标号:比较结果为大于等于 跳转执行标号 否则不跳转
b.eq 标号:比较结果为等于 跳转执行标号 否则不跳转
b.hi 标号:比较结果为无符号大于 跳转执行标号 否则不跳转
b.lt:比较结果为小于 跳转执行标号 否则不跳转
b.le:比较结果为小于等于 跳转执行标号 否则不跳转
b.ne:比较结果为不等于 跳转执行标号 否则不跳转

iOS一页是16k

switch汇编实现,当选择小于4时(不包括default),与if else类似,大于等于4且条件值连续后,通过一次运算直接查表执行。例如:

(会生成表)
 switch (a) {
        case 1:
            printf("123");
            break;
        case 2:
            printf("红");
            break;
        case 3:
            printf("蓝");
            break;
        case 4:
            printf("蓝123");
            break;
        default:
            break;
    }

(不会生成表,类似if else)
 switch (a) {
        case 1:
            printf("123");
            break;
        case 200:
            printf("红");
            break;
        case 300:
            printf("蓝");
            break;
        case 350:
            printf("蓝123");
            break;
        default:
            break;
    }

上一篇下一篇

猜你喜欢

热点阅读