ARM简介与汇编
- 格式:pdf
- 大小:1.12 MB
- 文档页数:62


arm汇编与逆向工程 蓝狐卷 基础知识
下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!
Download tips: This document is carefully compiled by this editor. I hope
that after you download it, it can help you solve practical problems. The
document can be customized and modified after downloading, please adjust
and use it according to actual needs, thank you! In addition, this shop provides
you with various types of practical materials, such as educational essays, diary
appreciation, sentence excerpts, ancient poems, classic articles, topic
composition, work summary, word parsing, copy excerpts, other materials and
so on, want to know different data formats and writing methods, please pay
attention!
当然,请看下面的文章示例:
ARM嵌⼊式开发中的GCC内联汇编__asm__
在针对ARM体系结构的编程中,⼀般很难直接使⽤C语⾔产⽣操作协处理器的相关代码,因此使⽤汇编语⾔来实现就成为了唯⼀的选择。但
如果完全通过汇编代码实现,⼜会过于复杂、难以调试。因此,C语⾔内嵌汇编的⽅式倒是⼀个不错的选择。然⽽,使⽤内联汇编的⼀个主
要问题是,内联汇编的语法格式与使⽤的编译器直接相关,也就是说,使⽤不同的C编译器内联汇编代码时,它们的写法是各不相同的。下
⾯介绍在ARM体系结构下GCC的内联汇编。GCC内联汇编的⼀般格式:
asm(
代码列表 : 输出运算符列表
: 输⼊运算符列表
: 被更改资源列表
);
在C代码中嵌⼊汇编需要使⽤asm关键字,在asm的修饰下,代码列表、输出运算符列表、输⼊运算符列表和被更改的资源列表这4个部分被3个“:”分隔。下⾯,我们看⼀个例⼦:
void test(void)
{
……
asm(
"mov r1,#1\n"
:
:
:"r1"
);
……
}
注:换⾏符和制表符的使⽤可以使得指令列表看起来变得美观。你第⼀次看起来可能有点怪异,但是当C编译器编译C语句的是候,它就是
按照上⾯(换⾏和制表)⽣成汇编的。
函数test中内嵌了⼀条汇编指令实现将⽴即数1赋值给寄存器R1的操作。由于没有任何形式的输出和输⼊,因此输出和输⼊列表的位置上什
么都没有填写。但是,在汇编代码执⾏过程中R1寄存器会被修改,因此为了通知编译器,在被更改资源列表中,需要写上寄存器R1。
寄存器被修改这种现象发⽣的频率还是⽐较⾼的。例如,在调⽤某段汇编程序之前,寄存器R1可能已经保存了某个重要数据,当汇编指令
被调⽤之后,R1寄存器被赋予了新的值,原来的值就会被修改,所以,需要将会被修改的寄存器放⼊到被更改资源列表中,这样编译器会
⾃动帮助我们解决这个问题。也可以说,出现在被更改资源列表中的资源会在调⽤汇编代码⼀开始就⾸先保存起来,然后在汇编代码结束时
释放出去。所以,上⾯的代码与如下代码从语义上来说是等价的。
第 1 天-ARM 汇编指令 LSL/LSR/ASL/ASR
移位 LSLASLLSRASRRORRRXARM 处理器组建了可以与数据处理指令
(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB
、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你还可以使
用桶式移位器影响在 LDR/STR 操作中的变址值。译注:移位操作在 ARM 指
令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表
示为指令中的选项。如果数据处理指令的第二个操作数或者单一数据传送指令
中的变址是寄存器,则可以对它进行各种移位操作。如果数据处理指令的第二
个操作数是立即值,在指令中用 8 位立即值和 4 位循环移位来表示它,所以
对大于 255 的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,
如果不能表示则生成一个错误。在逻辑类指令中,逻辑运算指令由指令中 S
位的设置或清除来确定是否影响进位标志,而比较指令的 S 位总是设置的。
在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。下面是
给不同的移位类型的六个助记符:LSL 逻辑左移 ASL 算术左移 LSR 逻辑右移
ASR 算术右移 ROR 循环右移 RRX 带扩展的循环右移 ASL 和 LSL 是等同
的,可以自由互换。你可以用一个立即值(从 0 到 31)指定移位数量,或用包
含在 0 和 31 之间的一个值的寄存器指定移位数量。逻辑或算术左移(Logical
or Arithmetic Shift Left)Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn
接受 Rx 的内容并按用 n 或在寄存器 Rn 中指定的数量向高有效位方向移位。
最低有效位用零来填充。除了概念上的第 33 位(就是被移出的最小的那位)之
常⽤的ARM汇编指令
转⾃:https:///zb861359/article/details/81027021?utm_source=app
1、 IMPORT和EXPORT
IMPORT ,定义表⽰这是⼀个外部变量的标号,不是在本程序定义的
EXPORT ,表⽰本程序⾥⾯⽤到的变量提供给其他模块调⽤的。
以上两个在汇编和C语⾔混合编程的时候⽤到。
2、AREA
语法格式: AREA 段名 属性1 ,属性2 ,…… AREA伪指令⽤于定义⼀个代码段或数据段。其中,段名若以数字开头,则该段名需⽤“|”括起来,如:|1_test|。 属性字段表⽰该代码段(或数据段)的相关属性,多个属性⽤逗号分隔。常⽤的属性如下: — CODE 属性:⽤于定义代码段,默认为READONLY 。 — DATA 属性:⽤于定义数据段,默认为READWRITE 。 — READONLY 属性:指定本段为只读,代码段默认为READONLY 。 — READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE 。 — ALIGN 属性:使⽤⽅式为ALIGN表达式。在默认时,ELF(可执⾏连接⽂件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐⽅式为2表达式次⽅。 — COMMON 属性:该属性定义⼀个通⽤的段,不包含任何的⽤户代码和数据。各源⽂件中同名的COMMON段共享同⼀段存储单元。 ⼀个汇编语⾔程序⾄少要包含⼀个段,当程序太长时,也可以将程序分为多个代码段和数据段。 使⽤⽰例: AREA Init ,CODE ,READONLY ; 该伪指令定义了⼀个代码段,段名为Init ,属性为只读。
3、LDR、LDRB、LDRH
ARM微处理器⽀持加载/存储指令⽤于在寄存器和存储器之间传送数据,加载指令⽤于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常⽤的加载存储指令如下:— LDR 字数据加载指令