ARM汇编与C语言对照
来源:互联网 发布:cnc编程入门教程 编辑:程序博客网 时间:2024/06/08 01:29
汇编语言的结构:
① 开头声明
② 数据初始化
④函数(入栈、操作、出栈)
③ 被初始化的数据的地址(文字池)
注意:②和③联系比较大,但为了让③处在不会被执行的地方,所以将③放在④之后。
下面的例子是一个算术运算的汇编与C的对照,首先是C语言
/*文件名:test.c*//*说明:算术运算*/int v1 = 1;static int v2 = 2; int main(void){ int vr; int v3 = 3, v4 = 4; vr = (v1 + v2 ) – ( v3 + v4 ) return vr;}
以下为汇编语言的内容(请结合表2-1-2理解本程序):
.file “test.c” .global v1 @声明v1为全局标签 .data @ 数据段开始 .align 2 @地址与4的倍数对齐 .type v1, %object @v1标签代表数据对象 .size v1, 4 @对象v1的长度为4v1: .word 1 @存放v1的初始值1 .align 2 @地址与4的倍数对齐 .type v2, %object @v2标签代表数据对象 .size v2, 4 @对象v2的长度为4v2: .word 2 @存放v2的初始值2 .text @ 代码段开始 .align 2 .global main @ 声明main为全局标签 .type main, %function @ main标签代表函数main: @ args = 0, pretend = 0, frame = 12 @ frame_needed = 1, uses_anonymous_args = 0 @入栈及开辟存放局部变量的空间 mov ip, sp @暂时用ip保存栈指针 stmfd sp!, {fp, ip, lr, pc} @ 入栈 sub fp, ip, #4 @ fp指向入栈的第一个元素(函数帧的开始) sub sp, ip, #12 @ 在栈上开辟3个整形数的空间,用于存放局部变量 @给v3,v4赋初值 mov r3, #3 str r3, [fp, #-20] @ 将v3赋值为3 mov r3, #4 str r3, [fp, #-24] @ 将v4赋值为4 @计算表达式v1+v2,将结果放到r1中 ldr r3, .L2 @ 将变量v1的地址加载到r3 ldr r2, .L2+4 @ 将变量v2的地址加载到r2 ldr r1, [r3, #0] @ 将变量v1的值加载到r1 ldr r3, [r2, #0] @ 将变量v2的值加载到r3 add r1, r1, r3 @ v1+v2的结果放到r1中 @计算表达式(v3+v4) ,将结果放到r3中 ldr r2, [fp, #-20] @ 将变量v3的值加载到r2上 ldr r3, [fp, #-24] @ 将变量v4的值加载到r3上 add r3, r2, r3 @ (v1+v2)+(v3+v4)的结果放到r3中 @将(v1+v2)-(v3+v4)的值放到r3中,保存,返回 rsb r3, r3, r1 @ 将(v1+v2) - (v3+v4)的值放到r3之中 str r3, [fp, #-16] @将结果保存到vr中 ldr r3, [fp, #-16] @将vr的值加载到r3中 mov r0, r3 @ 将(v1+v2) - (v3+v4)的值放到r0中返回 @出栈 sub sp, fp, #12 @ 重设栈指针准备返回 ldmfd sp, {fp, sp, pc} @ 返回 .L3: .align 2.L2 .word v1 @变量v1的地址,即标号v1【使.L2获得v1的指针】 .word v2 @变量v2的地址,即标号v2 .size main, .-main @ main函数的大小,当前位置减去main标号处 .ident “GCC: (GNU) 3.4.4”
这里有点4需要注意的:
① 全局变量都被放在数据段上,数据段中保存的其实是变量的初始值
② 未用static声明的变量会被声明为.global,表示他可以链接到其它文件。
③ 加载全局变量实际上使用的是文字池的方法,即将变量地址放在代码段中某个不会执行到的位置,使用时先加载变量的地址,然后通过变量的地址得到变量的值。
④ 每条汇编指令只能执行一个简单的运算,计算的中间结果使用寄存器保存。如果表达式非常复杂以至于无法用寄存器保存所有的中间结果,则还会在栈上开辟局部变量来保存。【非静态的局部变量都放在栈上,通过帧指针和偏移量的方式来访问。帧指针(fp)在开始时设好,整个函数执行期间不会该变(而期间sp会改变)。】
- ARM汇编与C语言对照
- C语言的字符串比较与汇编的对照
- 嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程
- 嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程
- ARM汇编与C语言混合编程之汇编调用C函数
- C与ARM汇编之一
- C语言与汇编
- 汇编与C语言
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- ARM中汇编调用c语言
- GCC ARM C语言嵌入汇编语法
- ARM汇编 C语言 C++ 相互调用
- ARM汇编冒泡排序之c语言调用汇编
- ARM汇编冒泡排序之汇编调用c语言
- ARM汇编, C语言和汇编混合编程
- oracle中内连接与外连接的区别及详解
- Deep learning------------Visualizing Higher Layer Features of a Deep Network.
- 在Linux下安装MySql 5.6.14
- 数理统计知识回顾
- 网络编程书籍推荐
- ARM汇编与C语言对照
- qt(2)tip
- 使用Xcode修改iOS项目工程名和路径名
- string方法:将s1,s2连接起来保存在s1中
- MYSQL 测试
- 修改 vi 中 comment 的显示颜色
- 在Eclipse中使用JUnit4进行单元测试(中级篇)
- HTML颜色设置
- 【运维】映射网络驱动器选项