ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ARM 汇编学习——编写简单的ARM汇编程序

2022-09-09 20:35:30  阅读:230  来源: 互联网

标签:汇编 操作数 助记符 汇编程序 指令 寄存器 ARM


  ARM汇编程序用“;”号进行注释。

一、汇编语言程序格式

       一个完整的ARM汇编由两部分组成:声明实际代码段两部分组成。

1、声明

在一个程序之前先要进行声明:

1)声明代码段:

用AREA指令定义一个段,说明所定义段的相关属性。(说明段的名字,段的属性)

2) 声明ARM指令:

用CODE32或CODE16来声明程序为32位ARM指令或是16位Thumb指令。

3) 声明程序入口:

用ENTRY指令标识程序的入口点。

注:

这3个声明缺一不可。

在程序完成后要用END 指令声明程序结束。每一个汇编程序段都必须有一条END指令,指示代码段的结束。

2、段

1)在ARM汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。

2)段的分类

代码段:代码段的内容为执行代码

数据段:数据段存放代码运行时需要用到的数据。

注:一个汇编程序至少有一个代码段。如果程序较长时,可以分割为多个代码段和数据段。多个段在程序编译连接时最终形成一个可执行的映像文件。

3)段具有以下的属性

Ø READONLY

Ø READWRITE

二、汇编语言的语句格式

[LABEL] OPERATION [OPERAND] [;COMMENT]

标号域 操作助记符域 操作数域 注释域

1. 标号域(LABLE)

1>标号域用来表示指令的地址、变量、过程名、数据的地址和常量。

2>标号是可以自己起名的标识符,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成。

3> 语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。

4> 语句标号必须在一行的开头书写,不能留空格。

2. 操作助记符域(OPERATION)

1>操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。

2> ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。

3> 所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后再书写指令。

4> 指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。

 

3. 操作数域(OPERAND)

操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开。

三、ARM指令集格式

opcode {<cond>}{S} <Rd>,<Rn> {,<operand2>}

1、其中<>中的项是必须的,{}中的项是可选的。

 

2、opcode 表示指令助记符。

cond:表示执行条件。

S:表示是否影响CPSR寄存器的值。

Rd:表示目标寄存器。

Rn:表示第一个操作数的寄存器。

operand2:表示第2个操作数。

 

3、“operand2”具有如下的形式:

1>#immed_8r:常数表达式

eg: MOV R0,#1

ADD R0,R1,#0X0F

2>Rm:寄存器形式。

即在寄存器方式下,操作数即为寄存器的数值。

eg: MOV PC,R0

ADD R1,R1,R2

3>Rm,shift:寄存器移位方式。

将寄存器的移位结果作为操作数,当Rm值保持不变。

Ø ASR #n:表示算术右移n位。

Ø LSR #n:表示逻辑右移n位。

Ø ROR #n:表示循环右移n位。

Ø RRX #n:带扩展的循环右移n位。

Ø LSL #n:逻辑左移n位。

 

4、 使用条件码“cond”可以实现高效的逻辑操作,提高代码的效率。

Ø 所有的ARM指令都可以条件执行。

Ø Thumb指令只有B(跳转)指令具有条件执行功能。

注:如果执行中不表明条件码,默认为无条件(AL)执行。

 

四、汇编程序中常用的符号

在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址

Ø 符号由大小写字母、数字以及下划线组成。

Ø 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。

Ø 符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。

Ø 自定义的符号名不能与系统的保留字相同。

符号名不应与指令或伪指令同名。

1. 程序中的变量:

1>ARM汇编程序所支持的变量有数字变量,逻辑变量和字符串变量

2>在ARM汇编程序设计中,可使用GBLA,GBLL,GBLS伪定义声明全局变量,使用LCLA,LCLL,LCLS声明局部变量,并可使用SETA,SETL和SETS对其经行初始化。

2. 程序中的常量

1>ARM汇编程序所支持常量有数字常量,逻辑常量和字符串常量。

3. 程序中的变量代换

1>程序中的变量可通过代换操作取的一个常量。代换操作符为”$”

2>使用示例:

LCLS    S1
LCLS    S2    ;定义局部字符串变量S1和S2
S1      SETS        “Test!”
S2      SETS        “This is a $ S1”;S2的值为“This is a Test

————————————————

版权声明:本文为CSDN博主「zqixiao_09」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zqixiao_09/article/details/50725254

标签:汇编,操作数,助记符,汇编程序,指令,寄存器,ARM
来源: https://www.cnblogs.com/icaowu/p/16673862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有