ARM汇编(非虫笔记)

1.ARM汇编的目的:

分析elf文件的需要。

2.原生程序生成过程。

(1)预处理,编译器处理c代码中的预处理指令。

gcc -E hello.c -o hello.i

(2)编译 gcc编译器首先要检查代码的规范性,以及是否有语法错误,在检查无误之后,gcc编译把代码翻译成ARM汇编语言的代码。

gcc -S hello.i -o hello.s

(3)汇编,gcc编译器会挑用汇编器将汇编代码汇编成二进制目标文件。

gcc -c hello.s -o hello.o

(4)链接,这个阶段会调用链接器将二进制的目标文件链接成android平台可执行的ARM远程程序。

gcc hello.o -o hello

3.ARM知识了解

(1)与JAVA的区别:

ARM汇编语言是一门"低级"语言可以和系统的底层相互沟通。

(2)ARM汇编语言编写的程序运行速度快,占用内存少

(3)缺点是编写的代码难懂,难以维护。

(4)ARM汇编语言,c语言能实现的ARM汇编语言都能实现。

(5)ARM具有31个通用寄存器,6个状态寄存器

(6)ARM处理器支持其中运行模式。

1. 用户模式:ARM处理器正常的程序执行状态。

2.快速中断模式:用于高速数据传输或通道处理。

3.外部中断模式:用于通用的中断处理。

4.管理模式:操作系统使用的保护模式。

5.数据访问终止模式:当数据或指令预取终止时进如该模式,可用于模拟存储及存储保护。

6.系统模式:运行具有特权的操作系统任务。

7.未定义指令中止模式:当未定义的指令执行时进入该模式。

4.ARM汇编语言程序结构

(1)处理器架构定义

.arch armv5te @处理器架构
.fpu softvfp  @协处理器类型
.ebi_attribute 20,1 @接口属性
.ebi_attribute 21,1
.ebi_attribute 23,1
.ebi_attribute 24,1
.ebi_attribute 25,1
.ebi_attribute 26,1
.ebi_attribute 30,1
.ebi_attribute 18,1

.arch指定了ARM处理器架构。

.armv5te表示本程序在armv5te架构处理器上运行。

.fpu指定了协处理器的类型。

softvfp表示使用浮点运算库来模拟协处理运算。

.ebi_attribute 指定了一些接口属性。

(2)段定义:

.section 定义只读数据,属性是默认
.text 定义了代码段。

因为之前读过了8086王爽的汇编,所以对段的理解很轻松。

(3)注释与标号

注释方法:/.../多行注释,@单行注释

标号:<标号名>:

eg:
    loop:
    ...
    end loop

标号和8086汇编很类似。

(4)汇编器指令

程序中所有以"."开头的指令都是汇编指令,他们不属于ARM指令集。

部分会汇编器指令:

.file: 制定了源文件名。
.align:代码对其方式。
.ascii:声明字符串。
.global:声明全局变量。
.type:指定符号的类型。

(5)字程序与参数传递。

声明函数的方法:

.global 函数名
.type  函数名,%function
函数名:
    <...函数体...>
声明一个实现两个数相加的函数的代码
.global MyAdd
.type MyAdd,&function
MyAdd:
    add r0,r0,r1
    mov pc,lr

ARM汇编规定:R0-R3这4个寄存器用来传递函数调用的第1到第4个参数,超过的参数通过堆栈来传递。

(6)ARM处理器寻址方式

1.立即寻址。

mov R0,#1234 @# z作为前缀,表示16进制时以"0x"开头

2.寄存器寻址。

mov R0,R1

3.寄存器移位寻址。

五种移位操作:

(1)LSL:逻辑左移,移位后寄存器空出的低位补0
(2)LSR:逻辑右移,移位后寄存器空出的高位补0
(3)ASR:算数右移,移动过程中符号位不变。如果操作数是整数,则移位后空出的高位补0,否则补1
(4)ROR:循环右移,移位后移出的低位填入移位空出的高位。
(5)RRX:带扩展的循环右移,操作数右移移位,移位空出的高位用C标志的值填充。
eg:

mov R0,R1,LSL #2

4.寄存器间接寻址

LDR R0,[R1]

5.基址寻址

LDR R0,[R1,#-4]

6.多寄存器寻址

LDMIN R0,{R1,R2,R3,R4}
LDM 是数据加载命令
指令的后缀IA表示每次执行完成加载操作后R0寄存器的值自增1
ARM中,字表示的是一个32位。
R1=[R0]
R2=[R0+#4]
R3=[R0+#8]
R4=[R0+#12]
Ps:这里+#4的原因是因为32位占4个字节。

7.堆栈寻址。

STMFD SP!,{R1-R7,LR} 入栈,多用于保存子程序“现场”
LDMFD Sp!,{R1-R7,LR} 出栈,多用于回复子程序的现场

8.块拷贝寻址。

块拷贝可实现连续地址数据从存储器的某一位置拷贝到另一位置。

LDMIN R0!,{R1-R3} @从寄存器指向的存储单元中读取3个字到R1-R3寄存器。

9.相对寻址 。

相对寻址一程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数的有效地址。

arm汇编笔记的更多相关文章

  1. ARM学习笔记11——GNU ARM汇编程序设计

    GNU ARM汇编程序设计中,每行的语法格式如下: [<label>:] [<instruction | directive | pseudo-instruction>] @c ...

  2. [国嵌笔记][024][ARM汇编编程概述]

    汇编程序用途 1.在bootloader与内核初始化时,还没有建立C语言运行环境,需要用到汇编程序 2.在对访问效率要求很高的情况下,需要用到汇编程序 ARM汇编分类 1.ARM标准汇编:适合于Win ...

  3. ARM汇编指令集_学习笔记(1)

    一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...

  4. ARM汇编学习笔记

    ARM  RISC  (Reduced Instruction Set Computers) X86   CISC  (Complex Instruction Set Computers)      ...

  5. 生成ARM汇编

    使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...

  6. ARM汇编指令特点

    根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...

  7. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  8. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

  9. 3.1 ARM汇编编程概述

    1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...

随机推荐

  1. Maven 仓库、坐标、常用命令

    maven中的仓库 需要jar包时,先到本地仓库中找,没有就从中央仓库去下载到本地仓库. 中央仓库很多都在国外,下载速度慢.国内的一些公司在自己的服务器上搭建了maven仓库(中央仓库的镜像),供内部 ...

  2. Linux 简介、目录结构

    Linux是类 Unix 操作系统. 根据原生程度可分为: 内核版本 发行版本:一些公司.组织在内核版的基础上进行二次开发 根据市场需求可分为: 服务器版:没有好看的界面,在终端操作,类似于dos 桌 ...

  3. Java软件工程师技能图谱

    原文链接:Java软件工程师技能图谱 最近在考虑"拥有怎样的技能才能算一名合格的java软件工程师呢?"这个问题.碰巧在github发现一个很棒的开源项目--程序员技能图谱.@Zh ...

  4. 【python基础语法】函数的作用域和内置函数和关键字(第7天课堂笔记)

    一.函数的作用域: 1.全局变量 2.局部变量 3.global 二.内置函数 1.常见的内置函数 print : 输出 input : 输入 type : 查看数据类型 id : 获取数据的内存地址 ...

  5. 如何用Eagle for Mac查看GIF动图的图文教程?

    Mac版Eagle怎样打开查看GIF动图?eagle mac版以其功能强大,设计简洁等特点深受用户的喜爱.在Eagle众多功能中,打开查看GIF动图这一功能也是非常简单又好用的.今天小编要给大家分享的 ...

  6. Asp.ner Core-Blazor随手记

    后续继续补充内容.... 1.安装.Net Core3.0 SDK及以上版本都有待Blazor 2.如果想在.razor页面直接使用C#代码,相当于html里面嵌入了C#代码,可以在命令行里面输入下面 ...

  7. vue.config.js添加路径别名

    在组件库中添加配置文件后其它文件需要引用它,此时想到利用路径的别名比较方便,相当于缩写了,请看下面的添加过程: (一)在vue.config.js文件中添加的内容如粗体字体所示: const path ...

  8. <a>超链接标签,<button>按钮标签,实现返回跳转

    超链接: <a href=”#” onClick=”javascript :history.back(-1);”>返回上一页</a> <a href=”#” onClic ...

  9. 安装Jenkins到Ubuntu(APT)

    运行环境 系统版本:Ubuntu 16.04.4 LTS 软件版本:Jenkins-2.176.2 硬件要求:最低内存:256MB.磁盘:1GB 安装过程 1.配置APT-Jenkins存储库 APT ...

  10. Pr常用的键盘操作

    Pr常用的键盘操作 Shift选中切开的小段 Alt复制效果