`
fantom
  • 浏览: 141957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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   
分享到:
评论

相关推荐

    IOS 面试题

    - 三目运算符在某些情况下可以让编译器生成更高效的机器码,因为它可以简化条件判断。 - 宏定义是预处理器完成的,它会在编译之前替换掉所有宏调用,因此宏定义中的计算是在编译时完成的,而非运行时。 在iOS面试...

    xamarin学习笔记B02(ios程序启动了解)

    2. **iOS程序启动流程**:iOS应用的启动通常始于Main函数,但这在Xamarin中有所不同。Xamarin.iOS的应用启动从`AppDelegate.FinishedLaunching`方法开始,这是iOS应用生命周期中的第一个方法,类似于Android的`...

    Flutter全套面试题含解析.docx

    3. **Portable(易于移植)**:Dart可以编译成ARM和X86机器码,使得应用能在iOS、Android以及更多平台上运行。 4. **Approachable(容易上手)**:Dart语言吸取了多种高级语言的特性,对于熟悉C++、C或Java的开发者...

    OC与C++的不同之处

    C++是一种静态类型语言,意味着变量的类型在编译时就已经确定,编译器会使用类型信息来检查程序中的错误,并为程序生成具体的机器码。C++的多态性主要通过虚函数机制来实现,这依赖于对象的类型信息在编译时就已经被...

    网易有道2017内推选择题.pdf

    - 解释程序是直接执行源代码而不是生成机器码,所以执行速度通常较慢。解释系统没有明确的编译阶段,目标程序不能脱离其语言环境独立执行。 10. B-树: - 10 阶的 B-树中,根节点最多包含 `9` 个关键字(每个节点...

    Modern C#系列课程(1):应用程序的执行

    - **编译**:C#源代码(`.cs`文件)通过C#编译器(csc.exe或dotnet build)编译成中间语言(IL)或直接编译成机器码(R2R)。 - **运行**:.NET应用程序通过CLR(Common Language Runtime)或.NET Core runtime...

    [OPTIMIZING]CALLING_CONVENTION

    目标文件格式用于保存编译后的机器码和符号信息。常见的格式包括: - **OMF**:用于某些嵌入式系统。 - **COFF**:Windows系统的标准格式。 - **ELF**:广泛应用于Linux系统。 - **Mach-O**:macOS和iOS的标准格式。...

    Swift基础教程.pdf

    - **性能**:Swift编译器经过优化,能够生成高效的机器码,这意味着使用Swift编写的程序运行速度非常快。 - **简洁性**:Swift语法简洁明了,易于阅读和编写。 #### 二、Swift基础语法 ##### 1. 变量和常量 Swift...

    DreamSoftTask

    2. 编译Dart源代码为机器码,对于Android,会生成Dalvik字节码(APK),对于iOS,会生成Objective-C或Swift的二进制代码。 3. 如果是在连接的设备或者模拟器上运行,`flutter run`会将应用安装到目标设备上。 4. ...

    ninny

    JIT编译允许快速迭代和调试,而AOT编译则可以生成优化过的机器码,提升应用的启动速度和运行性能。 3. **强类型系统**:Dart是静态类型的,这意味着在编译时就能捕获很多类型错误,提高了代码的稳定性和可维护性。 ...

    埃斯洛

    - **高性能**:Swift编译为原生机器码,运行速度接近C和C++。 - **强大的库支持**:Swift与Apple的Cocoa和Cocoa Touch框架无缝集成,提供了丰富的API和工具。 2. **Swift的基础语法**: - **变量与常量**:`var`...

    pruebaFlutter

    Dart的语法简洁明了,易于学习,且性能优秀,可以编译为JavaScript或原生机器码。 2. **Flutter框架**:Flutter的核心特点是其"Hot Reload"功能,这使得开发者能够快速迭代和调试应用。Flutter使用单一代码库进行跨...

    objc代码-小测试小测试

    编译器会将源代码转换成机器码,然后由iOS或macOS的运行时环境执行。 以上就是Objective-C编程的一些核心知识点,对于理解和操作这个"objc代码-小测试小测试"项目至关重要。通过学习和实践这些概念,开发者可以更好...

    MobileDevIISB

    4. **编译原生代码**: Xamarin的编译器会将C#代码编译成对应平台的原生机器码,确保应用性能接近于原生应用。 【MobileDevIISB-main】可能包含的组件 1. **源代码文件**: 项目的主体代码,包括C#类、接口、方法等...

    ProjectD:基于flutter开发的项目

    在Flutter中,Dart代码被编译为原生机器码,以实现高性能的移动应用开发。 【文件名称列表解析】 由于提供的文件名称列表只有一个:"ProjectD-main",我们可以推断这可能是项目的主要源代码目录或者入口文件。在...

    CodingChallenges:我尝试过的所有编码挑战的列表

    3. **性能**:Swift编译为机器码,执行效率高,且其内存管理机制有效避免了内存泄漏。 4. **互动性**:Swift Playground允许开发者实时查看代码执行结果,方便测试和调试。 5. **Swift Package Manager (SPM)**:...

    blogpostVoting:用Flutter编写的投票应用程序

    在Flutter应用中,Dart代码被编译成原生机器码,从而实现流畅的用户体验。 **初始化Flutter项目** 要开始“blogpostVoting”项目,首先需要安装Flutter SDK,并设置好环境变量。然后在命令行中使用`flutter create`...

    Delphi_Didatico:参考资料,请参阅Delphi的实际资料

    - 性能优化:Delphi的编译器直接生成机器码,代码执行效率高,但需要注意内存管理和算法选择。 - 错误处理:学会使用try-finally、except语句进行异常处理,确保程序稳定性。 - 设计模式:理解并应用常见的设计...

    capstone

    3. **详细反汇编信息**:Capstone返回的反汇编结果包括指令的机器码、地址、操作数、指令名称和描述,帮助理解代码行为。 4. **插件系统**:Capstone允许添加新的架构或修改现有架构的行为,通过插件机制增强了其...

    diya_TechNox

    6. **dart2native编译器**:Dart可以编译成原生机器码,提供接近原生的运行速度。 7. **Flutter框架**:Dart是Flutter的首选语言,Flutter用于构建高性能、跨平台的用户界面,适用于iOS、Android、Web和桌面平台。 ...

Global site tag (gtag.js) - Google Analytics