GNU汇编伪指令
.text 将定义符开始的代码编译到代码段
.data 将定义符开始的代码编译到数据段
.end 文件结束
.equ GPG3CON, 0XE03001C0 定义宏(GPG3CON代替0XE03001C0 )
.byte 定义变量 1字节
.byte 0x11,'a' , 0 定义字节数组
.word 定义word变量(4字节 32位机)
.word 0x32974332,0x47839438
.string 定义字符串
.string "hfek\0"
ldr r0,=0xE002802 载入大常数0xE002802 到 r0 中
.global _start 声明_start 为全局符号
例:拷贝ROM中字符串到RAM中
.text
start:
ldr r5,=srcBuf
ldr r6,=desBuf
loop:
ldrb r4,[r5]
cmp r4,#0
beq main_end
ldrb r0,[r5],#1
strb r0,[r6],#1
b loop
main_end:
b main_end
srcBuf:
.string "faj;sf"
.data
destBuf:
.space 8
.end
批量操作指令
(ia - Inncrement After ib-Increment Before da-Dec After db-Dec Before)
ldmia r0!,{r3 - r10} //r0里地址指向的内容批量,load到r3 ~r10 寄存器中,r0里地址会自动加4
stmia r0!,{r3 - r10} //把r3 ~r10寄存器中的内容,store到r0里地址执行空间中,r0里地址会自动加4
例:
.text
ldr r12,=srcBuf
ldr r13,=dstBuf
ldmia r12!,{r0 - r11}
stmia r13!,{r0 - r11}
.data
srcBuf:
.string "fjjldsfs"
srcBuf_end:
dstBuf:
.space 12*4
.end
堆栈操作指令
stmfd sp!,{r0 - r12,lr} //将寄存器r0 ~r12 lr中的值存入栈中,常用于中断保护现场,!表示会自动偏移
ldmfd sp!,{ro - r12,pc}^ //将栈中的值逐个弹出到寄存器r0 ~ r12 pc中,常用于中恢复断现场,^表示会恢复spsr到cpsr
STMFD sp!,{r4 - r7,lr}
LDMFD sp!,{r4 - r7,pc}
ARM指令高级
软中断指令
swi 0x02 //产生软中断,软中断号为2