iOS main函数 机器码

main 启动对应机器码分析

0x2730: pushl $0 ( 将出错码入栈)
当异常发生时,如果控制单元没有自动地把一个硬件错误代码插入到栈中,相应的汇编语言片段会包含一条pushl $0指令,在栈中垫上一个空值,如果错误码已经被压入堆栈,则没有这条指令。然后,把异常处理函数的地址压进栈中;函数的名字由异常处理程序名与do_前缀组成

0x2732: movl %esp, %ebp
栈指址(低地址)%esp栈顶值赋给栈基址(高地址)%ebp栈底,设置 main函数的栈基址

0x2734: andl $-16, %esp
它等价于 andl $0xfffffff0,%esp,也就是说把%esp内的最后4位给抹掉,强制让%esp的值是16的倍数,GCC默认的堆栈是16字节对齐的,为了加快CPU的访问效率

0x2737: subl $16, %esp
%esp栈顶向下移动16个字节,给临时变量留出来

0x273a: movl 4(%ebp), %ebx
保存旧的栈基址,4(%ebp)等于 : (%ebp +4) ,%ebp + 4
是表示一个地址值,加上括号表示存储在该地址上的内容

0x273d: movl %ebx, (%esp)
复制对齐的指针 ,把%ebx的值写到栈顶,但不会使栈指针值发生变化

0x2740: leal 8(%ebp), %ecx
局部变量的地址直到程序运行才能被识别,必须用leal指令寻址。但leal的效率相对movl xxx要低得多 ,传送%ebp+8的地址写到%ecx寄存器

0x2743: movl %ecx, 4(%esp)
把%ecx的值写到%esp+4

0x2747: addl $1, %ebx
%ebx+1

0x274a: shll $2, %ebx
%ebx 左移2位

0x274d: addl %ecx, %ebx
%ebx+ %ecx

0x274f: movl %ebx, 8(%esp)
把%ebx值写到%esp+8

0x2753: movl (%ebx), %eax
把%ebx值写到%eax寄存器

0x2755: addl $4, %ebx
%ebx+4

0x2758: testl %eax, %eax
testl的执行会影响状态寄存器。%eax & %eax
如果al不为0,则testb %eax , %eax,标志位NZ为1

0x275a: jne 0x2753 ; start + 35
jne不等于时转移

0x275c: movl %ebx, 12(%esp)
把%ebx值写到%esp+12

0x2760: calll 0x27b0 ; main at main.m:14
calll 将当前的IP压栈后,转到标号处执行指令
调用0x27b0标示的程序

0x2765: movl %eax, (%esp)
把%eax值写到%esp

0x2768: calll 0xb2db6 ; symbol stub for: exit
调用0xb2db6标示的程序

0x276d: hlt
cpu暂停,等到有复位信号或中断信号输入再运行

0x276e: nop
空指令,就是让cpu等待一个周期,可能等待外设输入
0x276f: nop
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值