【汇编语言】【ARM扩展资料】汇编语言开发
【ARM扩展资料】汇编语言开发
文章目录
- 【ARM扩展资料】汇编语言开发
- 一、指令格式
- 1.典型的A64指令格式
- 2.加减法的简单指令示例:
- 二、语句格式
- 1.汇编语言语句的通用格式:
- 三、显示程序
- 1.信息显示程序(使用C语言函数)
- 2.信息显示程序(使用Linux系统功能)
- 四、C语言程序的开发过程
- 1.预处理(预编译,Preprocessing)
- 2.编译(Compilation)
- 3.汇编(Assembly)
- 4.连接(Linking)
一、指令格式
遵循精简指令集计算机RISC的思想,ARM处理器固定使用二进制32位长度为ARM指令编码(指令代码),称为ARM指令集。1995年推出16位编码的指令集,Thumb指令集,后改进为支持16位和32位指令编码的Thumb-2指令集。这样,既简化了软件开发,又易于提高代码密度、效率和性能。
ARMv8推出了全新的64位指令集,称为A64,运行于64位执行状态AArch64,仍采用32位指令编码。原ARM指令集和Thumb指令集分别改称为A32和T32,运行于32位执行状态AArch32。
ARM汇编语言中,指令助记符、寄存器名可以全是大写、或者全是小写,但不能大小写混用。
1.典型的A64指令格式
opcode Rd, Rn {,operand2}
opcode
——指令操作码,使用助记符表达。Rd
——目的寄存器。Rn
——源操作数寄存器1。operand2
——第2个源操作数,可以是立即数、寄存器、存储单元,具有多种寻址方式。
2.加减法的简单指令示例:
ADD X0, X1, X2 // 64位加法:X0 = X1 + X2ADD W5, W3, W4 // 32位加法:W5 = W3 + W4SUB X6, X7, X8 // 64位减法:X6 = X7 - X8SUBS W9, W11, W12 // 32位减法:W9 = W11 - W12,更新NZCV标志
二、语句格式
主要有两种ARM汇编语言语法,一是ARM公司的汇编程序(armasm)使用的统一汇编语言UAL语法(ARMASM语法),另一个GNU汇编程序(AS)的GNU ARM汇编语言语法。AS属于GCC编译器套件。
1.汇编语言语句的通用格式:
标号: 指令|指示符|伪指令 // 注释
其中垂直短线“|”表达“或者”、即多个之一。
(1)标号:标号以冒号结尾。
(2)汇编语言语句有两种,一是处理器指令语句,一是汇编程序指示符。指示符均以小数点“.”开头,其助记符不能大小写混用,只能全为大写或全为小写。在ARM处理器的汇编语言中,伪指令形式上像指令,但可能产生处理器指令,也可能生成汇编程序指示符。
(3)注释(Comments):AArch64汇编语言以双斜线“//”开始,也可以采用斜线加星号(/* */)形式括起注释(与C语言一样)。
三、显示程序
1.信息显示程序(使用C语言函数)
64位ARM汇编语言程序,文件名假设为hello.s。
.data // 数据区msg: .string "Hello, ARMv8!\n" // 定义字符串(以0结尾).text // 代码区.global mainmain: stp x29, x30, [sp, -16]! // 保护寄存器x29和x30adr x0, msg // 获取字符串地址bl printf // 调用C语言函数printf显示mov x0, 0 // 返回值ldp x29, x30, [sp], 16 // 恢复寄存器x29和x30ret // 返回
汇编语言程序使用main作为入口函数,main函数开始就是程序执行的第一条指令。函数最后执行“RET”返回指令,程序流程返回到调用程序。入口主函数执行完成,也就意味着程序终止执行,将控制权返回操作系统。
可以使用“.END”汇编结束指示符。不用的话,源程序文件结束于一个新行。
因为使用了C函数,本程序需要使用GCC汇编和连接,命令如下:
gcc -o hello hello.s
生成可执行文件,hello,程序执行输入:
./hello
2.信息显示程序(使用Linux系统功能)
64位ARM汇编语言程序,文件名假设为hello.s。
.data // 数据区msg: .ascii "Hello, ARMv8!\n" // 定义字符串len=.-msg // 计算字符串长度,等价给len符号.text // 代码区.global _start_start: mov x0,0 // X0 = 第1个参数(输出设备,0表示标准输出、即显示器)adr x1,msg // X2 = 第2个参数(字符串首地址)mov x2,len // X3 = 第3个参数(字符串长度)mov x8,64 // Linux系统功能(write)的调用号(64)svc 0 // 调用Linux系统功能mov x0,0 // X0 = 第1个参数(返回值)mov x8,93 // Linux系统功能(exit)的调用号(93)svc 0 // 调用Linux系统
本程序可以采用AS汇编和LD连接:
as -o hello.o hello.s
ld -o hello hello.o
采用GCC进行汇编和连接,起始标号“_start”要更改为“main”:
gcc -o hello hello.s
如果改为“main”后,还要用LD连接,加上“-e main”参数即可。
生成可执行文件,hello,程序执行输入:
./hello
四、C语言程序的开发过程
假设C语言程序的文件名:hello.c
使用GCC开发C语言程序,命令很简单:
gcc -o hello hello.c
选项参数“-o”(小写字母)给出生成的文件名。
实际上,GCC开发过程需要经过预处理、编译、汇编和连接4个步骤(阶段)。这些步骤虽然都可以通过其编译程序GCC实现,但实际上用到了多个程序文件。
1.预处理(预编译,Preprocessing)
使用CPP文件,处理源程序文件(* .c)中以#开头的语句,生成预处理后的文本文件(* .i)。
gcc –E –o hello.i hello.c
参数“-E”(大写字母)表示仅预处理、生成文本文件,不进行编译、汇编和连接。
2.编译(Compilation)
使用CC文件,将预处理后的文本文件(* .i)翻译成汇编语言程序(* .s)。
gcc –S hello.i
参数“-S”(大写字母)表示进行编译,生成汇编语言程序,但不进行汇编和连接。
可以直接针对源程序文件,将预处理和编译步骤一并进行:
gcc –S hello.c
默认生成与源程序文件名相同的汇编语言程序文件,加参数“-o”可另指定一个。
3.汇编(Assembly)
使用AS文件,将汇编语言程序(* .s)翻译为目标代码文件(* .o)。
gcc –c hello.s
也可以针对预处理文件或者源程序文件进行汇编:
gcc –c hello.i
gcc –c hello.c
参数“-c”(小写字母)表示(预处理、)编译和汇编,生成目标代码文件,不连接。默认生成的目标代码主文件名与源程序主文件名相同(扩展名不同)。
4.连接(Linking)
使用LD文件,组合目标代码文件(*.o)以及需要的库文件代码等生成可执行文件。
gcc –o hello hello.o
可以直接对汇编语言程序、预处理文件和源程序文件进行,分别是:
gcc –o hello hello.s
gcc –o hello hello.i
gcc –o hello hello.c
生成可执行文件后,在Linux平台输入文件名就可以执行,命令如下:
./hello
【汇编语言】【ARM扩展资料】汇编语言开发相关推荐
- 【汇编语言】【ARM扩展资料】数据表示
[ARM扩展资料]数据表示 文章目录 [ARM扩展资料]数据表示 一.常量表达 1.常数 2.字符和字符串 3.符号常量 4.数值表达式 二.指示符 1.区段定义指示符 2.标号属性指示符 3.数据定 ...
- 【汇编语言】【ARM扩展资料】硬件组成
[ARM扩展资料]硬件组成 文章目录 [ARM扩展资料]硬件组成 一.ARM处理器 1. ARM体系结构 2. Cortex系列处理器 3. ARMv8-A处理器 二.结构基础 1. 异常 2. 执行 ...
- 【汇编语言】【ARM扩展资料】数据寻址
[ARM扩展资料]数据寻址 文章目录 [ARM扩展资料]数据寻址 一.寄存器寻址 1. 寄存器移位寻址 2. 寄存器扩展寻址 二.存储器寻址 1. 寄存器间接寻址 2. 带立即数偏移量的寄存器间接寻址 ...
- 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全
史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux ...
- 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全...
史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux主要shell命 ...
- c语言和java和汇编语言_C语言和汇编语言的区别是什么?
展开全部 区别如下: (1)两者编译组成不同.汇编语言是将由0.1组成的机器语言用具有简单语义的32313133353236313431303231363533e4b893e5b19e31333366 ...
- 基于OMAP3530硬件平台的ARM和DSP协同开发方法
基于OMAP3530硬件平台的ARM和DSP协同开发方法 来源:电子技术应用2013年第2期 作者:林上升,韩润萍 2013/3/21 17:32:55 http://www.chinaaet.co ...
- 一位前端开发者的计算机视觉学习之路——专访《Chrome扩展及应用开发》作者李喆
李喆从2011年开始接触Chrome扩展程序开发并发布了多款扩展程序,同年10月,他收到了新浪微博前端高级工程师职位的offer,次年4月火狐邀请他参与火狐浏览器扩展开发的工作.现在,李喆是吉林大学电 ...
- ARM+linux+2440嵌入式开发相关经典书籍(转)
源:ARM+linux+2440嵌入式开发相关经典书籍 转载于:https://www.cnblogs.com/LittleTiger/p/7992971.html
最新文章
- 微软发布全新多核心操作系统原型:Barrelfish
- sourcesafe管理phpproj文件的补充说明(downmoon)
- Maya mayapy.exe 安装 Cython,编译 pyd
- lua中的require、dofile、loadfile
- 递归实现 十进制转换其他进制(2-16)
- Iframe父页面与子页面之间的相互调用
- PIC18F452之1602自定义字符
- php缓存类,PHP缓存类
- Spring boot - Thymeleaf 使用
- 保存时自动加分号_作为测试行业发展趋势,自动化一点也不难啊!
- 查看php探针,什么是php探针
- 三菱驱动器参数表_三菱伺服驱动器参数都设置什么啊详细点谢谢
- 基于Maya 2018安装OpenVDB插件
- 批量删除多个 Word 文件中的分节符
- 信息安全必备的8张思维导图
- 帝国cms如何安装php模板,帝国CMS整站源码通用安装教程
- English 介词
- 使用C# .net开发微信公众号之设置所属行业
- 财经APP富途牛牛商业模式分析
- 一个女人努力工作的意义
热门文章
- 找出你的windows子系统(WSL)的安装位置
- jsonrpc php使用,php实现的一个简单jsonrpc框架实例
- three轨迹线在mapbox地图上显示
- 博图能打开s7200吗_透明胶真的能把车窗打开吗?现场实验给你看,能成功吗?...
- 程序异常exitcode非0_ARM寄存器分析以及异常处理方法
- c语言单片机常用函数,C51单片机C语言函数编辑 -单片机-电子工程世界网
- php条件语句中大括号必须,PHP条件,括号需要?
- mysql sharding 知乎_分库分表系列(1)-shardingsphere核心概念
- @RequestParam注解用法
- java map集合使用_JAVA中Map集合的使用举例