必须知道的GNU伪指令(共11页)_第1页
必须知道的GNU伪指令(共11页)_第2页
必须知道的GNU伪指令(共11页)_第3页
必须知道的GNU伪指令(共11页)_第4页
必须知道的GNU伪指令(共11页)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、必须(bx)知道的GNU ARM伪指令-讲师(jingsh):程姚根一、.global 伪指令该伪指令的含义是让 .global 修饰(xish)的符号对连接器可见,也就是说,一个函数或变量通常情况下只在文本文件内有效,当需要在外部引用该文件里的某一个函数或变量时,必须首先将该函数或变量使用.global伪指令进行声明。例如:.gloabl _start.global main_start : b main 这里的_start要被外部的链接脚本使用,所以声明为全局。这里的main符号是外面文件实现的main函数,main函数也是在外面实现的,所以声明为全局。二、.equ 伪指令该伪指令其实很简

2、单,相当于C中的宏定义。使用格式如下:.equ 名字,值例如:.equ MAX,100 其实就是等价(dngji)于C语言的#define MAX 100是一个意思。三、.align伪指令功能为使代码(di m)对齐到某一边界。在ARM体系结构下,.align 后边(hu bian)的数以幂的形式出现的,例如:.align 2 表示从此处开始代码要以4字节对齐,呵呵,有人经常会问什么意思呀。它还有一个变体:.balign 这里的b就是byte的缩写。如果写成.balign 4就是直接表示4字节对齐。先来看一个实例代码:.align 4表示,以16字节对齐。可以看到其前面只有一条指令,在ARM状

3、态每条指令占用4字节,则还需要填充三条指令,就以达到16字节对齐了。它反汇编的结果:看完反汇编结果后我们(w men)得出如下规律:从第一条ARM指令(zhlng)开始,到.align 4这个位置,要求总指令的条数是8的倍数,即.align 4所在的地址 + 4能整除8。如果不是则需要填充。从.align 4开始,到最后一条指令,也要求总指令的条数是8的倍数,如果不是则需要填充。那它什么(shn me)时候会用到呢?我们先来看一下一下代码:编译(biny)后的结果:错误的意思是分支目标出现了偏差,即没有对齐了。ARM指令要求4字节对齐,由于.byte是占用一个字节,此时(c sh)就没有对齐啦

4、。怎么解决这个问题呢?加一个.align对齐一下就可以了。修改(xigi)后的代码:编译成功(chnggng)后,反汇编的结果如下:有些(yuxi)人常常写成这样,如下图所示:四、.macro 伪指令macro伪操作可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,标号会被替换为用户定义的符号。宏操作可以使用一个或多个参数(cnsh),当宏操作被展开时,这些参数被相应的值替换。宏操作的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开

5、销,因此,在代码较短且需要传递的参数较多时,可以使用宏操作代替子程序。语法(yf)格式: .macro 宏名 参数(cnsh)名列表 伪指令.macro定义(dngy)一个宏 宏体 .endm .endm表示宏结束 实例:通过宏来实现memcpy功能.global _start.text_start:b reset.macro memory_copy src_addr,dest_addr,num保存r0,r1,r2,r3参数在使用的时候,前面要加上stmfd sp!,r0,r1,r2,r3ldr r0,=src_addrldr r1,=dest_addrldr r2,=numloop:ldr

6、r3,r0,#4str r3,r1,#4sub r2,r2,#1cmp r2,#0恢复(huf)r0,r1,r2,r3ldmeqfd sp!,r0,r1,r2,r3bne loop .endmreset:memory_copy SRC_ADDR,DEST_ADDR,4stop:b stopSRC_ADDR:.word 0 x0a.word 0 x0b .word 0 x0c .word 0 x0d DEST_ADDR:.word 0 xff .word 0 xff .word 0 xff.word 0 xff反汇编的结果(ji gu)如下:asm.o: file format elf32-li

7、ttlearmDisassembly of section .text:00000000 : 0: eaffffff b 4 00000004 : 4: e92d000f push r0, r1, r2, r3 8: e59f0040 ldr r0, pc, #64 ; 50 c: e59f1040 ldr r1, pc, #64 ; 54 10: e3a02004 mov r2, #4 ; 0 x400000014 : 14: e4903004 ldr r3, r0, #4 18: e4813004 str r3, r1, #4 1c: e2422001 sub r2, r2, #1 ; 0

8、 x1 20: e3520000 cmp r2, #0 ; 0 x0 24: 08bd000f popeq r0, r1, r2, r3 28: 1afffff9 bne 14 0000002c : 2c: eafffffe b 2c 00000030 : 30: 0000000a .word 0 x0000000a 34: 0000000b .word 0 x0000000b 38: 0000000c .word 0 x0000000c 3c: 0000000d .word 0 x0000000d00000040 : 40: 000000ff .word 0 x000000ff 44: 00

9、0000ff .word 0 x000000ff 48: 000000ff .word 0 x000000ff 4c: 000000ff .word 0 x000000ff 50: 00000030 .word 0 x00000030 54: 00000040 .word 0 x00000040五、GNU 局部(jb)编号局部标号:局部标号 主要在局部范围内使用而且局部标号可以重复出现(chxin)。它由两部组成开头是一个0-99直接的数字局部标号 后面加“:” F:指示(zhsh)编译器只向前搜索(front)B:指示编译器只向后搜索(back)实例如下:编译(biny)后,反汇编如下:内容总结(1)

温馨提示

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

评论

0/150

提交评论