ARM汇编的内存操作详解
内存操作-读取内存:
跟内存相关的指令无非是把内存中读取到计算机里面或者把计算机的内容读取到内存里面。存储器和计算机之间的一个互换。这些指令也可以在我们之前的相关文档里去查询。ARM汇编去官网下载相关的文档就行。
内存操作指令分为:单寄存器读写指令、多寄存器内存访问指令(连续的进行操作一段时间内存,把它读到计算机里面)和数据交换指令
内存操作结构:
LDR:把我们内存中的数据读取到计算器里面。内存是分块的,内存最小的单位是字节(byte),到为了便于管理,所以存储器会分页,分页的时候它会用到另一个单位:word 字长。一个word就是4个字节,以32位为一个单位。所以默认单位是字长来进行一个读取。同理,STR就是按字长把计算器里面的值放到内存里面。现在详细地讲一下:LDR后面跟上 Rn Add
例:我们打开这样一个项目,在这里我们开始做一下我们今天这一块。我先把我们的内存里的一个值读到某个计算器里面,我们就用LDR
比如我读到R0吧,我把0x12这个地址给它读进来,这个地方要注意一点,这个地方可不是我们的move,所以这个地方不能直接用立即数。不直接用立即数有两种方法。把R1的值所指向的(这个地方有中括号,中括号表示计算机间接寻址,它的值所指向的内存的地址空间的值读出来复到R0里面。再看下一块,0x12就是找12
2就是对应的FF ,但是要读32位,也就是4个字节。现在把值给赋过去
现在读出的地址是0010E7FF ,我们找到的这个起始位是FF,然后是E7。FF是起点,却被放在后面,这就是小端模式(低位放低地址,高位放高地址)。为什么会是这样?实际上,是这样读的
它会根据地址先判断哪个是最小的字空间,然后把字空间的内容读出来。同样,如果往后读,会不会挨着往后走呢?我们来验证下:先改一下,不是0012了,改成0014。R1最开始就是0,给它加上立即数。
还可以用微指令。现在值已经赋过来了
66
E800E800,新的字单元。从第9个开始,10E7FF00,可以看出,内存要分页,最小的也是分了断的。所以内存操作往往是按照字长来的。