汇编初探
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;
}