全部博文(174)
分类: LINUX
2009-04-09 17:35:28
ARM汇编入门知识子集 1)汇编语言的格式: AREA... ENTRY START ... STOP MOV R0, 0X18 LDR R1, =0X20026 SWI 0X123456 END 2)调用子程序: BL ... BX LR 3)条件执行: ... 4)加载常量: LDR, R?, =... 5)加载地址: ADR R?, LABEL ADRL R?, LABEL LDR, R?, =LABEL 6)使用堆栈 MOV SP, #0X400 LDMFD ... STMFD... 7)常用指令 跳转指令 数据处理指令 逻辑运算指令 加减运算指令 比较指令 移位指令 乘法指令 LOAD/STORE指令 单个寄存器传输 索引方式 前索引 自动变址的前索引 后索引 内存粒度 B 无符号字节(加载时零扩展为 32 位。) SB 有符号字节(符号扩展为 32 位。) H 无符号半字(加载时零扩展为 32 位。) SH 有符号半字(符号扩展为 32 位。)
- 如果是字,则省略。 多个寄存器传输 8)常用伪指令 符号定义伪指令 EQU 数据定义伪指令 DCD DCB 9)跳转表的组织 AREA EX, CODE, READONLY NUM EQU 2 ENTRY START MOV R0, #0 MOV R1, #1 MOV R2, #2 BL ARITHFUNC STOP MOV R0, #0X18 LDR R1, =0X20026 SWI 0X123456 ARITHFUNC CMP R0, #NUM BXHS LR LDR R3, =JUMPTAB LDR PC, [R3, R0, LSL #2] JUMPTAB DCD DOADD DCD DOSUB DOADD ADD R0, R1, R2 BX LR DOSUB SUB R0, R1, R2 BX LR END 10)关于立即数和桶形移位器的概念: 符号定义的值被引用的时候,应该使用#NUM的形式 引用标签的时候一般式=LABEL的形式(32位常数地址值) 一般能使用常数的地方可以使用寄存器 桶形移位器和寄存器一起被视为相当于寄存器 11)交换指令 SWP和SWPB |