首页
社区
课程
招聘
[翻译]ARM汇编基础教程——数据类型和寄存器
发表于: 2017-8-20 22:25 11539

[翻译]ARM汇编基础教程——数据类型和寄存器

2017-8-20 22:25
11539

ARM汇编基础教程

——数据类型和寄存器

原文链接:https://azeria-labs.com/arm-data-types-and-registers-part-2/

翻译:ljcnaix

和高级语言一样,ARM汇编语言支持对不同数据类型的操作。我们可以load(或store)的数据类型包括signed/unsigned wordshalfwords或者bytes。我们用“-h”或“-sh”后缀表示half words,用“-b”或“-sb”表示bytes,无后缀默认表示words。有符号和无符号数据类型之间的区别有:

§  有符号数可以表示正直和负值,所以范围较小;

§  无符号数只能表示正值,所以范围更大。

下面是使用loadstore指令操作不同类型数据的示例:

字节序


在内存中有两种存储多字节数据的方式,大端序和小端序。这两种方式的差异是数据存储时的字节顺序不同。在以小端序存储数据的设备中(如x86),位权低(个位的位权比十位低)的字节存储在低地址(地址值小的地址)。在以大端序存储数据的设备上,位权高的字节存储在低地址。上一篇我们提到过,ARM架构在ARMv3之前是小端序的,在那之后,ARM处理器可以通过硬件配置在大小端之间切换。以ARMv6为例,指令是固定的以小端序存储的,而内存数据的读取方式可以通过控制程序状态寄存器CPSR的第9位实现在大端和小端之间切换。

ARM处理器的寄存器个数与ARM指令集版本有关。根据ARM手册,除了基于ARMv6-MARMv7-M的处理器,其它的ARM处理器都有3032 bit的通用寄存器。前17个(原文是16个,我觉的可能是作者犯的off-by-one错误,如果理解有误,请高手指正)寄存器是在用户模式下可访问的,其它的寄存器只有在特定的运行模式下才可以访问(ARMv6-MARMv7-M除外,它们的架构有一些差异,有兴趣的话可以单独去学习)。在这篇教程中,我们将关注那些可以在任何运行模式下被访问的寄存器:r0~r15还有CPSR。这16个寄存器可以被分为两组:通用寄存器和专用寄存器。

寄存器

别名

作用

R0

-

通用

R1

-

通用

R2

-

通用

R3

-

通用

R4

-

通用

R5

-

通用

R6

-

通用

R7

-

常用于保存系统调用号

R8

-

通用

R9

-

通用

R10

-

通用

R11

FP

用于保存栈帧

专用寄存器

R12

IP

内部调用暂存寄存器

R13

SP

栈顶指针

R14

LR

用于保存函数返回地址

R15

PC

用于保存下一条指令的地址

CPSR

-

当前程序状态寄存器

下面这张表将ARM的寄存器和x86寄存器做了一个简单类比:

ARM

简述

X86

R0

通用寄存器

EAX

R1~R5

通用寄存器

EBXECXEDXESIEDI

R6~R10

通用寄存器

-

R11FP

栈帧寄存器

EBP

R12

内部调用暂存寄存器

-

R13SP

堆栈寄存器

ESP

R14LR

链接寄存器

-

R15PC

程序计数器

EIP

CPSR

当前程序状态寄存器

EFLAGS

R0~R12R12的使用要慎重):R0~R12是通用寄存器(R12已经不完全是了),它们可以在常规操作中使用,来存储临时变量或地址。习惯上,R0常在算数运算中作为累加器,或者存储函数的返回地址。R7常用于存储系统调用号。R11常作为栈帧指针来标记函数栈帧的边界。此外,ARM的函数调用约定规定,函数的前四个参数存储在寄存器r0~r3中。

R13R13是堆栈指针(SPStack Point)。它指向堆栈的顶部。堆栈是用来存储函数局部存储的一段内存,在函数返回时回收。堆栈指针通过减去我们要分配的空间大小,来分配堆栈上的空间。比如,我们要分配一个32 bit的空间,那么就令R134

R14R14是链接寄存器(LRLink Register)。当进行函数调用时,链接寄存器被更新为调用函数指令的下一条指令的地址。这样做可以使程序在执行完子函数之后得以返回父函数。

R15R15是程序计数器(PCProgram Counter)。在执行指令时,PC总是自动的增加,增加的大小等于正在执行指令的长度。这个长度在ARM架构下是固定的,ARM模式是4字节,Thumb模式是2字节。当执行分支指令时,PC被更新为目的地址。需要注意的是,由于RISC CPU流水线优化的原因,在执行期间,ARM模式下PC等于当前指令地址加8Thumb模式下等于当前指令地址加4,也就是后移两条指令。这不同于x86EIP寄存器,总是指向当前指令的下一条指令。

下面我们通过调试器来看看PC的行为。我们使用下面的程序,先将PC保存在寄存器r0中,然后随意执行两条指令。让我们看看会发生什么:

.section .text

.global _start

.global _main

_start:

    b _main


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/08/25
最新回复 (16)
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学Z80、8086汇编已经是三十多年前。时代变了,学无止境,才能跟上时代。
2017-8-21 08:12
0
雪    币: 58
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Windows  desktop  on  ARM64马上要出来了,又有的学的。
2017-8-21 21:21
0
雪    币: 41
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主辛苦,感谢分享!
2017-8-23 17:31
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
辛苦了,感谢分享!
2017-8-24 10:38
0
雪    币: 202
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大小端的那张图是不是说反了
2017-8-24 16:08
0
雪    币: 221
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
好难
2017-8-24 16:41
0
雪    币: 210
活跃值: (646)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2017-8-25 11:37
0
雪    币: 331
活跃值: (410)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
孤独的小木虫 大小端的那张图是不是说反了
检查了一下,图片基本没问题(图片展示的顺序和一般我们在调试器里看到的是一致的,描述有点不清楚,需要结合文字描述理解)。如果觉得有疑问的话,建议用调试器跟一下。
2017-8-25 12:36
0
雪    币: 210
活跃值: (646)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
11
孤独的小木虫 大小端的那张图是不是说反了
没有啊
2017-8-25 15:08
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢楼主分享。
2017-8-25 15:30
0
雪    币: 1535
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享!期待下一章!!
2017-8-29 11:30
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错!!!
2017-8-29 18:28
0
雪    币: 1365
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶一下
2017-8-30 21:09
0
雪    币: 155
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
寄存器知识,在那里都不闲多;
2017-9-14 10:35
0
雪    币: 233
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
那些代码我根本看不懂,说好的基础呢
2018-2-19 12:03
0
雪    币: 0
活跃值: (17)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18

最后于 2018-6-19 21:51 被ese丶编辑 ,原因:
2018-6-19 21:41
0
游客
登录 | 注册 方可回帖
返回
//