1. ARM机器码
用命令“arm-linux-objdump -D -Sstart.elf”可以查看start.elf的反汇编信息,例如其中的一行:30008000: e59f008c 翻译成汇编,就是ldr r0, [pc, #140],其中的e59f008c就是32bit的ARM机器码。关于ARM机器码的详细解释,可参看《ARM Architecture Reference Manual》以及《The ARM Instrction set encoding》进行分析。
2. 定义类伪指令
而伪指令,就是没有对应的机器码,只能在编译的过程中起作用,在编译时转化为其他实际指令运行。
用命令“arm-linux-readelf -a start.elf”可查看地址和段信息。
2.1 .global :定义一个全局标号
2.2 .ascii :定义一个字符串
2.3 .byte :定义一个字节的数据
2.4 .word :定义一个字的数据
2.5 .data :定义数据段
2.6 .equ :定义一个宏
2.7 .align :4字节对齐
例如:
.data
hello:
.ascii "abcdefg" ;利用反汇编可观察到
bh: ;word 0x64636261
.byte 0x1 ;word 0x68676665
.align 4
add
.word 0xff
.text
.global _start
_start:
.equ DA, 0x89
mov r0, #DA
3. 操作类伪指令
3.1 nop :空操作,实质是执行了一个mov r0, r0的操作
3.2 ldr :如果要向r0填入大于8bit的立即数,可以ldr r0, =0x1ff,但mov r0, #0x1ff就不行,因为mov只能8bit立即数,多了就不行了。(重要)
4. ARM协处理器访问指令(可参考《ARM920T》手册)
4.1 协处理器——cp15:主要用于执行特定的处理任务,ARM最多支持16个协处理器,在ARM中,cp15用于协助处理器控制cache,clock,mmu等。
4.2 协处理器访问指令:mcr,mrc
例如:mrc p15,0,r0,c0,c0,0
总结:
内存访问:str ldr
cpsr访问: msr mrs
cp15访问:mcr mrc