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是能被四整除的,是四字节对齐。
-
操作类伪指令:
Ldr的例子:
运行结果:
-
由于伪指令是转为实际的指令执行的呢?
反汇编看看:
他是转化为实际的ldr存储器指令运行的。
Nop的例子:是空操作是延时的作用。
反汇编:
实际的操作是mov r0,r0的操作,没有什么意义,只是延时操作。
反汇编的命令:
arm-linux-objdump -D -S start.elf
查看信息:
arm-linux-readelf -a start.elf