ARM机器码

我们打开我们的ARM Architecture Reference Manual.pdf。这是一份很重要的资料。在第三章的第一节: 

上面就是机器码的格式了。下面是31~28四位是条件信息: 

Opcode指令类型的信息:21~14位: 

下面我们就以mov指令为例,来讲他的机器码的内容。就是他对应的机器码: 

这里我们一下面两条代码:

为例:指令的详解 

首先是反汇编:如下: 

 

我们通过转变:

Mov r0,r1的机器码0xe1a00001= 0b 1110 00 0 1101 0 0000 0000 000000000001

Moveq r0,0xff的机器码0x03a000ff=0b 0000 00 1 1101 0 0000 0000 000011111111

上面就是两个指令对应的机器码:

下面是mov机器码的格式:

我们在上面的机器码分析中知道,后12位是表示数的大小的。可是只有8位2进制数大小,前面四位是移位信息位。所以表示的数最大0xff。当我们把他改为0x1ff的时候会报错: 

这就是下来要学习的了:伪指令。

伪指令

2.伪指令定义:

伪/指令本身并没有所对应的机器码,它只是在编译的时候起作用,或者转化为其他的实际指令来运行。

 

指令看似该指令执行了操作,其实他不会产生机器码。伪指令的作用:1、它只是在编译的时候起作用,就像我们在C语言用#define定义一个宏一样,只是在编译的时候起作用。

2、能够起到操作的作用,是转为其他指令运行。

一、定义类伪指令:

Global:定义一个全局的符号。

Data:定义数据段。数据存到数据段。

Ascii:字符串

Byte:字节 

Word:字 

Equ:相当于宏定义 

Align:设置对齐。 

 代码:


编译的截图: 

上图知道:data的起始地址是500080c8:往下内容: 

 

上面可以看到,我们的数据已经存进了数据段了。以后,我们就可以通过标号访问数据段的数据了。 

Equ:宏定义伪指令

 

上面可以看到r0是0x89,宏定义成功。

Align的例子: 

我们从上面的例子知道,bh标号处的地址是500080d3,是没有四字节对齐的。现在我们设置他四字节对齐: 

设置后的地址变成500080e0是能被四整除的,是四字节对齐。 

  1. 操作类伪指令: 

    Ldr的例子: 

    运行结果:

  2. 由于伪指令是转为实际的指令执行的呢? 

    反汇编看看: 

    他是转化为实际的ldr存储器指令运行的。

Nop的例子:是空操作是延时的作用。 

反汇编: 

实际的操作是mov r0,r0的操作,没有什么意义,只是延时操作。 

反汇编的命令: 

arm-linux-objdump -D -S start.elf 

查看信息: 

arm-linux-readelf -a start.elf

 

posted @ 2021-07-15 15:03  edward_liu2000  阅读(1364)  评论(0编辑  收藏  举报