GNU环境下的伪指令_第1页
GNU环境下的伪指令_第2页
GNU环境下的伪指令_第3页
GNU环境下的伪指令_第4页
GNU环境下的伪指令_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

3.GNUARM汇编伪操作符号定义伪操作数据定义伪操作汇编与反汇编代码控制伪操作预定义控制伪操作1)符号定义伪操作(1)常量定义伪操作.equ或.set格式.equ symbol,expr.set symbol,expr说明Symbol-要指定的名称,它可以是以前定义过的符号;Expr-表示数字常量或程序中的标号。示例.equ Undef_Mode,0x1B.equ

Mode_Mask,0x1F.equ NOINT, 0xC0.global_start.text_start:MRS R0,CPSR @读CPSR BIC R0,R0,#Mode_Mask

ORR R1,R0,#Undef_Mode|NOINT @修改

MSR CPSR_cxsf,R1 @进入未定义模式Stop: B Stop @使程序停在此处查看结果.end(2)常量定义伪操作.equiv格式:.equivsymbol,expr说明Symbol-要指定的名称,它不可以是以前定义过的符号;Expr-表示数字常量或程序中的标号。(3)声明全局变量伪操作.global或.globl格式.global symbol.globl symbol说明Symbol-为要声明的全局变量名称,该变量可以被其它文件引用。(4)声明外部变量伪操作.extern格式:.extern symbol说明symbol-为要声明的外部变量名称,该变量在其它文件中被定义。例如:在C编程中要引用汇编中定义的函数或变量,则要在C中用extern进行声明引用。

GNU

ARM

编译环境下,在汇编程序中要使用.global伪操作声明汇编程序为全局的函数,可被外部函数调用,同时在C程序中要用关键

extern

声明要调用的2)数据定义伪操作(1)字节定义.byte格式:.byte expr{,expr}…说明expr-数字表达式或程序中的标号。(2)半字定义.hword或.short格式.hword

expr{,expr}…..short expr{,expr}…说明expr-数字表达式或程序中的标号。(3)字定义.word或.int或.long格式.word expr{,expr}…..int

expr{,expr}….long expr{,expr}…说明expr-数字表达式或程序中的标号。(4)双字定义.quad格式:.quad expr{,expr}…说明expr-数字表达式。(6)字符串定义.ascii和.asciz或.string格式.ascii

expr{,expr}….asciz

expr{,expr}….stringexpr{,expr}…说明expr-表示字符串。(5)四字定义.octa

格式:.octa expr{,expr}…说明expr-数字表达式。(7)单精度浮点数定义.float或.single格式.float expr{,expr}…..single expr{,expr}….说明Expr-为32位的IEEE单精度浮点数。(8)双精度浮点数定义.double格式:.double expr{,expr}…说明expr-为64位的IEEE双精度浮点数。(9)声明数据缓冲池.ltorg格式:.ltorg说明在使用LDR伪指令时,要在适当的位置加入.ltorg声明数据缓存池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用.ltorg声明数据缓冲池,则汇编器会在程序末尾自动声明。3)汇编与反汇编代码控制伪操作(1)指令集类型标识伪操作.arm.code32.thumb.code16(2)段属性定义伪操作格式:.sectionexpr说明expr-为段属性,可以是.text、.data、.bss中的一个。(3)段起始声明伪操作格式.text.data.bss(4)对齐方式设置伪操作.align或.balign格式.align {alignment}{,fill}.balign {alignment}{,fill}说明alignment-是一个数值表达式,用于指定对齐方式,其取值在0~15范围内;默认为字对齐。Fill-用来指定进行填充的数据。(5)代码位置设置伪操作.org

格式:.orgoffset{,expr}

说明offset-是一个数值表达式,表示地址偏移量;Expr-用来指定进行填充的数据。4)预定义控制伪操作汇编器在对程序代码进行编译时,会根据汇编控制伪操作的定义情况对程序进行编译,常用的有条件编译、宏定义和文件包含(1)文件包含伪操作.include格式:.include "file_name"说明用于将一个源文件包含到当前的源文件中,所包含的文件在.include指令的位置处进行汇编处理。(2)条件编译伪操作.if格式.if logical_expression程序代码段A {.else程序代码段B} ..endif

(3)宏定义伪操作.macro格式.macro{ macroname {parameter{,parameter}…}程序代码段.endm

4.2ARM汇编语言的语句格式1.ARM编译环境下汇编语句格式2.ARM编译环境下汇编语句中的符号规则3.GNU环境下ARM汇编语句格式4.GNU环境下ARM汇编程序编译

1.ARM编译环境下汇编语句格式{程序标号}{指令}{;注释}{程序标号}{伪操作}{;注释}{程序标号}{伪指令}{;注释}2.ARM编译环境下汇编语句中的符号规则1)符号命名规则符号由大小写字母、数字、下划线组成,且符号是区分大小写的。符号在其作用范围内必须是唯一的。程序中的符号不要与指令助记符或者伪操作同名。局部标号可以用数字开头,其他的标号不能。2)变量数字变量逻辑变量字符串变量3)常量十进制数,如535、246。十六进制数,如0x64、0xff00。n_XXX,n表示n进制数,从2~9,XXX是具体的数字。例如:8_3777字符常量用一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如‘A’、‘\n’。字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如果需要使用双引号”或字符$,则必须用””和$$代替。4)字符串表达式操作字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。与字符串表达式相关的运算符:

LEN:计算字符串长度运算符。

CHR:ASCII码转换运算符。STR:字符串转换运算符。LEFT:字符串取左运算符。RIGHT:字符串取右运算符。CC:字符串连接运算符。例如:abcSETS"one""doublequote"improbSETS"literal":CC:(abc:LEFT:4)6)局部标号局部标号是一个0~99之间的十进制数字,可重复定义。局部标号后面可以紧接一个通常表示该局部变量作用范围的符号。局部变量的作用范围为当前段,也可以用伪操作ROUT来定义局部标号的作用范围。局部变量命名语法:n{routname}局部变量引用的语法格式:%{F|B}{A|T}n{routname}汇编器默认搜索:先向后搜索,再向前搜索。从当前层次到宏最高层次,比当前层次低的层次不再搜索。n是局部标号的数字号。routname是当前局部范围的名称。%表示引用操作。F指示汇编器只向前搜索。B指示汇编器只向后搜索。A指示汇编器搜索宏的所有嵌套层次。T指示汇编器搜索宏的当前层次。3.GNU环境下ARM汇编语句格式{程序标号:}{指令}{@注释}{程序标号:}{伪操作}{@注释}{程序标号:}{伪指令}{@注释}4.GNU环境下ARM汇编程序编译1)预处理GNU汇编器as的内部预处理包括:移除多余的间隔符及代码中的所有注释,并将字符常量转换为数字值。它不作宏处理和文件包含处理,但这些事情可以交由gcc编译器去做,文件包含可以用.include伪指令来实现。2)注释GNUARMAssembly可识别的注释方式有:C风格多行注释符/*...*/或GNU单行注释符“@”或“#”。3)符号与C语言基本一致,符号名由字母、数字以及'_'和'.'组成,大小写敏感。4)段与重定位链接器ld用于把多个目标文件合并为一个可执行文件。汇编器as生成的目标文件都假定从地址0开始,ld为其指定最终的地址。链接器ld把目标文件中的每个section都作为一个整体,为其分配运行的地址。

在ARM(Thumb)汇编语言程序中以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段(CodeSection)和数据段(DataSection),代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映像文件。可执行映像文件通常由以下几部分构成。一个或多个代码段,代码段的属性为只读。零个或多个数据段,数据段的属性为可读写。数据段可是被初始化的数据段或没有被初始化的数据段(ZI,zeroinitialized)。4.3汇编语言的程序格式311.在ARM集成开发环境下AREAFCTRL,CODE,READONLY;声明代码FCTRLENTRY ;标识程序入口START MOV R0,#0X3000;初始化寄存器

MOV R1,#0X10000001 MOVR2,#100loop_1 STR R1,[R0],#4 ADDR1,R1,#1 SUBSR2,R2,#1 BNE loop_1

MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2 LDR R1,[R0],#4 ADDS R8,R1,R8 ADC R9,R9,#0 SUBS R2,R2,#1 BNE loop_2Stop B Stop END ;文件结束332.在GNUARM开发环境下.global _start.text_start: MOV R0,#0X3000@初始化寄存器

MOV R1,#0X10000001 MOV R2,#100loop_1: STR R1,[R0],#4 ADD R1,R1,#1 SUBS R2,R2,#1 BNE loop_1

MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2: LDR R1,[R0],#4 ADDSR8,R1,R8

ADC R9,R9,#0

SUBS R2,R2,#1 BNE loop_2Stop: B Stop.end @文件结束4.4ADT

温馨提示

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

评论

0/150

提交评论