- 浏览: 141957 次
- 性别:
- 来自: 北京
文章分类
最新评论
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
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
发表评论
-
Foundation和UIKit框架组织图
2013-01-28 08:58 6185... -
[转]linux常用命令
2013-01-26 22:33 893本文来自于http://blog.csdn.net/totog ... -
[转] NSString 控件消息
2013-01-19 15:52 1060【转】http://www.tongwenguan.com/o ... -
关闭arc
2013-01-17 22:35 04.2前的xcode中,打开“Build Setting”,找 ... -
地址薄源码分析
2013-01-17 10:13 1640ContactViewController.h 头文件 #im ... -
歌曲源码剪切分析
2013-01-16 17:19 7579mian.m 以及appdelegate就不说了,主要说说C控 ... -
[转]深入理解Objective-c中@class的含义
2013-01-16 07:16 1040[转]http://blog.prosight.me/i ... -
UIImageView【转】
2013-01-16 07:17 5464【转】http://my.oschina.net/plumso ... -
isKindOfClass<> isMemberOfClass[转]
2013-01-15 10:27 0转http://blog.csdn.net/totogo201 ... -
NSString 截取,文件读取【转】
2013-01-16 07:18 1530【转】http://www.cnblogs.com/csj00 ... -
loadNibNamed
2013-01-15 10:05 0动态加载,就是在程序运行当中,根据需要动态地加载一些视图,常常 ... -
respondsToSelector
2013-01-15 09:31 2514respondsToSelector该方法询问对象以确定其是否 ... -
initWithFrame<>initWithCoder
2013-01-15 09:19 1765initWithFrame 和 initWithCode ... -
协议protocol
2013-01-16 07:17 1086自定义协议语法如下: @protocol 协议名称 方法之声明 ... -
addSubview<>insertSubView
2013-01-15 08:35 3561addSubview是一层一层往上加,新加的只能放到父视图的最 ... -
UIViewController生命周期[转]
2013-01-15 00:09 974转http://www.cnblogs.com/smileEv ... -
IBOutlet IBaction 详解
2013-01-14 23:33 4372IBOutlet对于编译器而言只是一个标记,也就是 ... -
AppDelegate.m 介绍
2013-01-14 22:59 6618【转】[url] www.cnblogs.com/xunzi ... -
didReceiveMemoryWarning
2013-01-14 21:52 5594[转]http://blog.csdn.net/yy404 ... -
OC-plist xib pch StoryBoard
2013-01-14 21:12 1231plist plist文件是什么呢? 它全名是: ...
相关推荐
- 三目运算符在某些情况下可以让编译器生成更高效的机器码,因为它可以简化条件判断。 - 宏定义是预处理器完成的,它会在编译之前替换掉所有宏调用,因此宏定义中的计算是在编译时完成的,而非运行时。 在iOS面试...
2. **iOS程序启动流程**:iOS应用的启动通常始于Main函数,但这在Xamarin中有所不同。Xamarin.iOS的应用启动从`AppDelegate.FinishedLaunching`方法开始,这是iOS应用生命周期中的第一个方法,类似于Android的`...
3. **Portable(易于移植)**:Dart可以编译成ARM和X86机器码,使得应用能在iOS、Android以及更多平台上运行。 4. **Approachable(容易上手)**:Dart语言吸取了多种高级语言的特性,对于熟悉C++、C或Java的开发者...
C++是一种静态类型语言,意味着变量的类型在编译时就已经确定,编译器会使用类型信息来检查程序中的错误,并为程序生成具体的机器码。C++的多态性主要通过虚函数机制来实现,这依赖于对象的类型信息在编译时就已经被...
- 解释程序是直接执行源代码而不是生成机器码,所以执行速度通常较慢。解释系统没有明确的编译阶段,目标程序不能脱离其语言环境独立执行。 10. B-树: - 10 阶的 B-树中,根节点最多包含 `9` 个关键字(每个节点...
- **编译**:C#源代码(`.cs`文件)通过C#编译器(csc.exe或dotnet build)编译成中间语言(IL)或直接编译成机器码(R2R)。 - **运行**:.NET应用程序通过CLR(Common Language Runtime)或.NET Core runtime...
目标文件格式用于保存编译后的机器码和符号信息。常见的格式包括: - **OMF**:用于某些嵌入式系统。 - **COFF**:Windows系统的标准格式。 - **ELF**:广泛应用于Linux系统。 - **Mach-O**:macOS和iOS的标准格式。...
- **性能**:Swift编译器经过优化,能够生成高效的机器码,这意味着使用Swift编写的程序运行速度非常快。 - **简洁性**:Swift语法简洁明了,易于阅读和编写。 #### 二、Swift基础语法 ##### 1. 变量和常量 Swift...
2. 编译Dart源代码为机器码,对于Android,会生成Dalvik字节码(APK),对于iOS,会生成Objective-C或Swift的二进制代码。 3. 如果是在连接的设备或者模拟器上运行,`flutter run`会将应用安装到目标设备上。 4. ...
JIT编译允许快速迭代和调试,而AOT编译则可以生成优化过的机器码,提升应用的启动速度和运行性能。 3. **强类型系统**:Dart是静态类型的,这意味着在编译时就能捕获很多类型错误,提高了代码的稳定性和可维护性。 ...
- **高性能**:Swift编译为原生机器码,运行速度接近C和C++。 - **强大的库支持**:Swift与Apple的Cocoa和Cocoa Touch框架无缝集成,提供了丰富的API和工具。 2. **Swift的基础语法**: - **变量与常量**:`var`...
Dart的语法简洁明了,易于学习,且性能优秀,可以编译为JavaScript或原生机器码。 2. **Flutter框架**:Flutter的核心特点是其"Hot Reload"功能,这使得开发者能够快速迭代和调试应用。Flutter使用单一代码库进行跨...
编译器会将源代码转换成机器码,然后由iOS或macOS的运行时环境执行。 以上就是Objective-C编程的一些核心知识点,对于理解和操作这个"objc代码-小测试小测试"项目至关重要。通过学习和实践这些概念,开发者可以更好...
4. **编译原生代码**: Xamarin的编译器会将C#代码编译成对应平台的原生机器码,确保应用性能接近于原生应用。 【MobileDevIISB-main】可能包含的组件 1. **源代码文件**: 项目的主体代码,包括C#类、接口、方法等...
在Flutter中,Dart代码被编译为原生机器码,以实现高性能的移动应用开发。 【文件名称列表解析】 由于提供的文件名称列表只有一个:"ProjectD-main",我们可以推断这可能是项目的主要源代码目录或者入口文件。在...
3. **性能**:Swift编译为机器码,执行效率高,且其内存管理机制有效避免了内存泄漏。 4. **互动性**:Swift Playground允许开发者实时查看代码执行结果,方便测试和调试。 5. **Swift Package Manager (SPM)**:...
在Flutter应用中,Dart代码被编译成原生机器码,从而实现流畅的用户体验。 **初始化Flutter项目** 要开始“blogpostVoting”项目,首先需要安装Flutter SDK,并设置好环境变量。然后在命令行中使用`flutter create`...
- 性能优化:Delphi的编译器直接生成机器码,代码执行效率高,但需要注意内存管理和算法选择。 - 错误处理:学会使用try-finally、except语句进行异常处理,确保程序稳定性。 - 设计模式:理解并应用常见的设计...
3. **详细反汇编信息**:Capstone返回的反汇编结果包括指令的机器码、地址、操作数、指令名称和描述,帮助理解代码行为。 4. **插件系统**:Capstone允许添加新的架构或修改现有架构的行为,通过插件机制增强了其...
6. **dart2native编译器**:Dart可以编译成原生机器码,提供接近原生的运行速度。 7. **Flutter框架**:Dart是Flutter的首选语言,Flutter用于构建高性能、跨平台的用户界面,适用于iOS、Android、Web和桌面平台。 ...