ARM数据定义伪汇编

数据定义伪汇编:DCB用于分配以前连续的字节存储单元并用指定的数据初始化。DCB也可以用“=”来代替。举个例子,如果要在某一片连续的空间里,我给它赋上01,02,03,设上这些初值,这就相当于之前我们定义的一些变量开辟空间的感觉。我们有时候定义一些结构结构体的时候,也要用到这样的空间开辟。

数据定义伪汇编:DCB:用于分配一片连续的字节存储单元并用指定的数据初始化。使用格式:name DCB value。

操作 比方说同样在这个地方做一个分配:dcContro DCB,下面给它分配一片连续的空间,分别给它赋上值,后面跟上的数据类型也是那三种数据类型(字符串,逻辑值,数据值。),下面跟一个数值,比如说,dcContro DCB 0x01,0x02,0x03这样三个值,用逗号隔开。意思就是随机在一个地方分配一段连续的内存空间分别给它填上这三个值,每个空间的间隔是按照字节为单位,正好我们填的是字节为单位这样的一个值。现在编译一下,这里又遇到问题了,这里又不认操作码了,

ARM数据定义伪汇编

现在解决了,再编译一下,这样编译成功了。入口的地方不要去破坏,为了保证弄清楚到时得地址在哪,我们好去观察,所以这里也用ADR,ADR,R3,dcControl,这里把dcControl放进来,好到时看在哪个地址。

ARM数据定义伪汇编

现在运行,在这个地方

ARM数据定义伪汇编

会进行空间的分配并且传值,传值的时候要看一下R3,也就是分配空间的起点在哪里,就看R3的寄存器。R3就是这个3000008,这里有一个内存的起始地址位。

ARM数据定义伪汇编

这里就给它标上0x30000000,这个地址分配了3个连续空间,起点是从30000008开始,现在就找30000008,09是01,02,03,正是和我们分配的值是一样的,这就证明我们这样是可行的。

DCW:用于分配一片连续的半字存储单元并用指定的数据初始化。 一看W就知道是字,word,一个字长4个字节,这是按字分配的。同样的也就是大小不一样,每一段最小单元的间隔不一样。这里改成W,

ARM数据定义伪汇编

用word代替bytes。再来看一下效果,还是找这个地方,30000008,这里01,02,03之间就空开了,这里是按照半字存储的。

DCD:用于分配一片连续的字存储单元并用指定的数据初始化。DCD是按全字存储的。来看一下,还是这个地方,这里就是全字存储,每4个字节为一空。

ARM数据定义伪汇编

我们用的最多的还是DCB。这里做一个更改,这里放一个字符串:hello。内存

ARM数据定义伪汇编

空间是按照字节为最小单位,hello就是按照这样来分,hello有6个字节,所以它会把每一个字符转成ask码,按照ask码的方式进行存储。为什么字符串hello有6个字符呢?因为这里还有一个我们看不到的/0。可以看一下,还是从8开始,这就是相关的ask码的一些定义,在这里最终显现出来的ask的样式就是hello。所以字符串是这样来存储的,这些都是计算机的基本原理。

DCFD:浮点双精度

DCFS:浮点单精度

DCQ:8字节为单位

这几组就负责在内存空间里面开辟一片连续区域,还可以在这一片连续的区域赋上相应的初值。

SPACE:用于分配一片连续的存储单元,并初始化为0,单位为字节。 比如:test SPACE 100 就表示开辟一片100个字节为单位的连续区域,并且给它赋为0。

MAP:用于定义一个结构化的内存,表首地址。MAP也可用"^" 代替。

FIELD:用于定义一个结构化的内存表的数据域。FILED也可用"#" 代替。

在其他高级语言,有结构体的概念,包括在做内核,做底层的时候,要用到大量的数据结构,我们都用结构体来进行标识。在c语言中是这样写的:结构体加上名称,里面又是各个字段,每个字段占几个字节的空间是看得出来的。这样子的结构体的定义在底层又如何去对应实现呢?这就通过MAP和FIELD实现。MAP是用来定义一个结构体的内存段的首地址,FIELD就是定义里面每一项的地址。比如说:MAP 0x100定义结构化内存表首地址的值为0x100。

A FLELD 16定义A的长度为16字节,位置为0x100。

B FIELD 32 定义B的长度为32字节,位置为0x100。

S FIELD 256 定义S的长度为256字节的位置为0x130。

本文转自:麦子学院
原文链接:http://www.maiziedu.com/wiki/arm/assembly/