[国嵌笔记][026][ARM伪指令]
ARM机器码
1.汇编程序通过汇编器变成机器码,然后才能在ARM处理器上运行
2.ARM机器码是一个32位的数,被分成了多个段,每个段都有各自的含义
3.格式:
cond:表示条件(4位)
I:表示源操作数是寄存器还是立即数
opcode:表示指令类型(4位)
S:表示是否影响cpsr寄存器
Rn:第一个源寄存器,有的指令中没有使用(4位)
Rd:目的寄存器(4位)
shift_operand:位移标志(4位)和第二个源寄存器或立即数(8位),所以mov指令中源操作数不能超过255
4.示例:
mov r0, r1 机器码:e1a00001
1110 00 0 1101 0 0000 0000 000000000001
moveq r0, #0xff 机器码:03a000ff
0000 00 1 1101 0 0000 0000 000011111111
伪指令定义
伪指令本身并没有对应的机器码,它只是在编译的时候起作用,或者转化为其他的实际指令来运行
定义类伪指令
1.global
作用:把一个标号定义为全局的,使其能够被其他C语言程序调用
示例:
.global _start
2.data
作用:定义数据段,表明数据将被存到数据段中
示例:
.data
3.byte word ascii
作用:定义数据类型
示例:
_byte: .byte 0xff
_word: .word 0xaabbccdd
_string: .ascii “hello world!”
4.equ
作用:宏定义,相当于C语言中宏的替换
示例:
.equ DATA, 0xff
mov r1, #DATA
5.align
作用:使数据地址按n字节对齐
示例:
.align 4
操作类伪指令
1.nop
作用:空操作指令,通常用来做延时
示例:
nop
@在执行时相当于
mov r0, r0
2.ldr
作用:用来在寄存器中装入大于8位的立即数,相当于mov,但mov不能装入大于8位的立即数
示例:
ldr r1, =0x1ff @在ldr伪指令中“=”表示立即数
@在执行时相当于
ldr r1, [pc, #-4]
.word 0x000001ff