远见-c与汇编混编_第1页
远见-c与汇编混编_第2页
远见-c与汇编混编_第3页
远见-c与汇编混编_第4页
远见-c与汇编混编_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 语言与汇编语言混编(WOZON)2012/10/24编改学生在此文稿基础性重新整理,注入自己的思维,并且在编改此文稿变成自己的东西。上签上自己名字,方能将目录学习目的2参考文献212参考文献2外部参考文献2.22.12.234GNU 伪指令3数据定义34.1编写日期作者内容概要2012-10-24WOZON创建编译控制伪指令3汇编中的宏函数4地址加载伪指令5其它杂项伪指令5GNU 程序编写格式及注释54.24.34.44.54.6ATPCS 规范6内联汇编1056Volatile 作用126.1C 语言变量在汇编中关系137学习目的1认识和使用 GNU 伪指令,学会 C 和 ASM 混编,

2、理解 ATPCS 原则。2 参考文献2.1参考文献参考文献指的是远见的文件。ARM.pptx来自远见2.2 外部参考文献外部参考文献指的是相对于上述参考文献以外的文件。3ATPCS:ARM(Thumb) Program Call Standard,ARM(或 Thumb)程序调用规范,主要规范 C 语言和汇编语言之间程序调用。GNU: GNUs Not Unix 的缩写,它的目标是创建一套完全的操作系统。4 GNU 伪指令伪指令本身不是 ARM 机器码指令集的成员,它是程序员编写程序的辅助指令,ARM 编译器会自动编译成相应的 ARM 机器指令码;同时帮助一些程序代码和数据码在内存中定位等功能

3、。GNU 为 ARM 编译器提供了较为完善的伪指令,便于程序员开发程序。4.1 数据定义常见的数据定义伪指令如下:单字节定义定义双字节数据.byte.short.byte.short.word0 x12,a,230 x1234,655350 x123456780 x1234567812345678.long /.word定义 4 字节数据定义 8 字节.quad.quad.float.float 定义浮点数.string/.asciz/.ascii0f3.2定义字符串.ascii“abcd0”,注意:.ascii伪操作定义的字符串需要每行添加结尾字符0,其他不需要.space数据空间定义.sp

4、ace 512 定义 512 个字节练习题:1、用上述伪指令定义一些数据,并且用指令对其进行操作和查看。4.2 编译控制伪指令使用.if .else .endif 格式来进行选择编译。条件是看.if 后面的表达式是否成立,格式如下:.iflogical-expressing.else.endif例子代码:.if 10 mov r0,#1.elsemov r0,#0.endif上面代码编译结果为:mov r0,#1其根 C 语言中的:#ifdef#else#endif功能类似。4.3 汇编中的宏函数跟 C 语言中的宏和 C+中内联函数一样,被调用时,在调用处自动展开,不会消耗堆栈空间。语法格式:

5、.macro$label macroname $parameter,$parameter.code.endm例子:/先定义参数变量:.equ n1, 1.equ n2, 2/定义宏函数:.macro TAdd n1 n2mov movaddr0,$n1 r1,$n2r0,r0,r1.endm/调用上面宏TAdd n1 n2B main调用C语言函数得到:340d8:340dc: 340e0:340e4:e3a00001 e3a01002 e0800001ea000009mov r0, mov r1,add r0,#1#2r0, r1b34110 4.4 地址加载伪指令ADRcond Rd,La

6、bel ADRLcond Rd,Label LDRcond Rd,=labellabel 有效值为:label-PC正负 255Byte。 label 有效值为:label-PC正负 64Kbyte。 label 可以是任意的 32bit 值。4.5其它杂项伪指令定义一下代码使用 ARM 指令集编译定义一下代码使用 Thumb 指令集编译arm.thumb.section.text.data.bss.align.arm.thumb.section定义一个段。expr 可以使.text将定义符开始的代码编译到代码段将定义符开始的代码编译到数据段,初始化数据段将变量存放到.bss 段,未初始化数据

7、段expr.data.bss.text subsection.data subsection.bss subsection.alignalignment,fill,max通过用零或指定的数据进行填充来使当前位置与指定边界对齐指定从当前地址加上 offset 开始存放代码,并且从.offset,expr当前地址到当前地址加上 offset 之间的内存单元,用零或指定的数据进行填充_start汇编程序的缺省是_ start 标号,用户也可以在连接文件中用 ENTRY标志指明其它点.global/ .globl :用来定义一个全局的符号文件结束.end.include 格式:.include “fi

8、lename”包含指定的头文件, 可以把一个汇编常量定义放在头文件中.equ格式:.equsymbol,expres把某一个符号(symbol)定义成某一个值(expres).该指令并不分配空间.(c 语言的#define)4.6 GNU 程序编写格式及注释代码行中的注释符号: 整行注释符号: #语句分离符号: ;直接操作数前缀: # 或 $标号:标号只能由 az,AZ,09,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号的后面加“:”。段内标号的地址值在汇编时确定;段外标号的地址值在连接时确定。局部标号:局部标号 主要在局部范围内使用而且局部标号可

9、以重复出现。它由两部组成开头是一个 0-99 直接的数字局部标号 后面加“:”用 b nF:n 为跳转的用 b nB:n 为跳转的,指示编译器只向前搜索;,指示编译器只向后搜索。举例:1: mov sp,r1b 1bsp=stacktop-(128*4*5),512*3=(8*512-8*5)5 ATPCS 规范ATPCS 又称 APCS 指定是 ARM 程序调用规范,汇编和 C 语言之间的调用。首先确定两件事:1、 C 语言中,任何函数内的局部变量都消耗堆栈。2、 C 语言中,函数调用的几乎参数都通过堆栈来传递。ATPCS 最简单的规定:1、小于等于 4 个字参数的直接用 R0R3 寄存器来

10、传递,并且用 FP 寄存器(FP-n)来操作,如果有返回值的使用 R0 寄存器来返回。2、如果大于 4 个以上的参数(每一个参数 32bit),将多出部分先压入栈中,让后按照第一步压入参数,函数中去参数数据时,使用 FP+n 方式取出多余的参数。3、浮点变量和结构体等参数都会按照上述两步骤方式实现传递,如果参数体多了和大了,会启动 IP 等寄存器参与工作。4、如果传入指针参数,就直接将地址作为参数传递,反而更加简单。下面内容可以量力学习,可不做重点,只要理解它们的行为即可。结构体参数传递例图:函数 tas 中的具体内容,得根据 tas 具体代码而变化。结构体用指针参数传递更加简单。6 内联汇编

11、指的是在 C 语言中嵌入汇编语言。内联汇编格式:asm volatile(命令表达式nt:输出参数列表域:输入参数列表域:破坏列表域);C 语言内联汇编:/一般,例如直接add(a,b)sum;asm volatile(add %0,%1,%2nt/命令格式例如add R0,R1,R2,/其中R0为输出,R1和R2为输入/为输出,替代命令格式中%0/为输入参数,替代%1和%2/破坏列表,告知这些东西需要保护,/因为命令格式中会使用到。:=r(sum):r (a),r(b):memory);return sum;或者,命令格式参数改成名称,便于阅读。add(a,b)sum;asm volatil

12、e(add %output,%input1,%input2nt:output=r(sum):input1r(a),input2r(b):memory);return sum;对应汇编:20008290 :20008290:20008294:20008298:2000829c:200082a0:200082a4:200082a8:200082ac:200082b0:200082b4:200082b8:200082bc:e52db004 e28db000 e24dd008 e50b0004 e50b1008 e51b2004 e51b3008 e0823003 e1a00003e28bd000e8

13、bd0800push add fp, sub sp, str r0, str r1, ldr r2, ldr r3, add r3, mov r0,add sp,fp sp, #0sp, #8;(strfp,sp,#-4!)fp,fp,fp,fp,#-4#-8#-4#-8r2, r3 r3fp, #0pop fpbx lre121e6.1 Volatile 作用在数学中解方程式,可能有多种解法,往往其中一种是最有效的。同样在编写程序完成某能时,不同的人编写出程序代码也可能不一样,虽然都完成了相同功能。许多编译器具有优化能力,它能在你的程序代码思础上,将指令进行优化,来达到最佳效果,当然你的主体思维更为重要,主体思维是本质上优化,编译器的优化属于修补性的。但是有些代码是不能优化的,否则就会出问题:例如P180 页程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论