【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扩展资料】汇编语言开发相关推荐

  1. 【汇编语言】【ARM扩展资料】数据表示

    [ARM扩展资料]数据表示 文章目录 [ARM扩展资料]数据表示 一.常量表达 1.常数 2.字符和字符串 3.符号常量 4.数值表达式 二.指示符 1.区段定义指示符 2.标号属性指示符 3.数据定 ...

  2. 【汇编语言】【ARM扩展资料】硬件组成

    [ARM扩展资料]硬件组成 文章目录 [ARM扩展资料]硬件组成 一.ARM处理器 1. ARM体系结构 2. Cortex系列处理器 3. ARMv8-A处理器 二.结构基础 1. 异常 2. 执行 ...

  3. 【汇编语言】【ARM扩展资料】数据寻址

    [ARM扩展资料]数据寻址 文章目录 [ARM扩展资料]数据寻址 一.寄存器寻址 1. 寄存器移位寻址 2. 寄存器扩展寻址 二.存储器寻址 1. 寄存器间接寻址 2. 带立即数偏移量的寄存器间接寻址 ...

  4. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

    史上最牛的Linux内核学习方法论   点击下载 我的arm_linux移植笔记   点击下载 S3C2440完全开发流程   点击下载 Linux系统命令及其使用详解完整版   点击下载 Linux ...

  5. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全...

    史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux主要shell命 ...

  6. c语言和java和汇编语言_C语言和汇编语言的区别是什么?

    展开全部 区别如下: (1)两者编译组成不同.汇编语言是将由0.1组成的机器语言用具有简单语义的32313133353236313431303231363533e4b893e5b19e31333366 ...

  7. 基于OMAP3530硬件平台的ARM和DSP协同开发方法

    基于OMAP3530硬件平台的ARM和DSP协同开发方法 来源:电子技术应用2013年第2期  作者:林上升,韩润萍 2013/3/21 17:32:55 http://www.chinaaet.co ...

  8. 一位前端开发者的计算机视觉学习之路——专访《Chrome扩展及应用开发》作者李喆

    李喆从2011年开始接触Chrome扩展程序开发并发布了多款扩展程序,同年10月,他收到了新浪微博前端高级工程师职位的offer,次年4月火狐邀请他参与火狐浏览器扩展开发的工作.现在,李喆是吉林大学电 ...

  9. ARM+linux+2440嵌入式开发相关经典书籍(转)

    源:ARM+linux+2440嵌入式开发相关经典书籍 转载于:https://www.cnblogs.com/LittleTiger/p/7992971.html

最新文章

  1. 微软发布全新多核心操作系统原型:Barrelfish
  2. sourcesafe管理phpproj文件的补充说明(downmoon)
  3. Maya mayapy.exe 安装 Cython,编译 pyd
  4. lua中的require、dofile、loadfile
  5. 递归实现 十进制转换其他进制(2-16)
  6. Iframe父页面与子页面之间的相互调用
  7. PIC18F452之1602自定义字符
  8. php缓存类,PHP缓存类
  9. Spring boot - Thymeleaf 使用
  10. 保存时自动加分号_作为测试行业发展趋势,自动化一点也不难啊!
  11. 查看php探针,什么是php探针
  12. 三菱驱动器参数表_三菱伺服驱动器参数都设置什么啊详细点谢谢
  13. 基于Maya 2018安装OpenVDB插件
  14. 批量删除多个 Word 文件中的分节符
  15. 信息安全必备的8张思维导图
  16. 帝国cms如何安装php模板,帝国CMS整站源码通用安装教程
  17. English 介词
  18. 使用C# .net开发微信公众号之设置所属行业
  19. 财经APP富途牛牛商业模式分析
  20. 一个女人努力工作的意义

热门文章

  1. 找出你的windows子系统(WSL)的安装位置
  2. jsonrpc php使用,php实现的一个简单jsonrpc框架实例
  3. three轨迹线在mapbox地图上显示
  4. 博图能打开s7200吗_透明胶真的能把车窗打开吗?现场实验给你看,能成功吗?...
  5. 程序异常exitcode非0_ARM寄存器分析以及异常处理方法
  6. c语言单片机常用函数,C51单片机C语言函数编辑 -单片机-电子工程世界网
  7. php条件语句中大括号必须,PHP条件,括号需要?
  8. mysql sharding 知乎_分库分表系列(1)-shardingsphere核心概念
  9. @RequestParam注解用法
  10. java map集合使用_JAVA中Map集合的使用举例