s3c2440 arm汇编指令以及使用示例
- 首先需要了解s3c2440CPU内部的寄存器有哪些:
寄存器/register | 作用 |
---|---|
R0 | 函数传入参数1 |
R1 | 函数传入参数2 |
R2 | 函数传入参数3 |
R3 | 函数传入参数4 |
R4 | 存放函数的局部变量 |
R5 | 存放函数的局部变量 |
R6 | 存放函数的局部变量 |
R7 | 存放函数的局部变量 |
R8 | 存放函数的局部变量 |
R9 | 存放函数的局部变量 |
R10 | 存放函数的局部变量 |
R11 | 存放函数的局部变量 |
R12 | IP内部调用暂时寄存器指针 |
R13 | SP栈指针,指向栈最新数据的地址 |
R14 | LR链接寄存器指针,在函数调用和在异常处理时,存放返回地址; |
r15 | PC程序计数器指针,存放正在执行指令的内存地址 + 8 |
- CPSR/SPSR寄存器格式:
位/Bit | 寄存器 | 作用 |
---|---|---|
31 | N/Negative | 如果结果是负数则置位。当用补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果是正数或零。 |
30 | Z/Zero | 如果结果是零则置位。Z=1表示运算的结果为零;Z=0表示运算的结果不为零。 |
29 | C/Carry* | 如果发生进位则置位 有4种方法影响C的值:1. 加法运算:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。2. 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出)时,C=0,否则C=1。3. 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。4. 对于其他的非加/减运算指令,C的值通常不改变。 |
28 | V/Overflow | 1.减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。2. 对于其它的非加/减法运算指令,V的值通常不改变。 |
[ 8 : 27 ] | Reserved | 保留 |
7 | I | 快速中断使能位 |
6 | F | 中断使能位 |
5 | T | 状态位:切换arm指令 / thumb指令 |
[ 0 : 4 | M0 ~ M4 | 模式位:切换不同CPU工作的模式 |
- arm指令
(1)运算指令
指令/Mnemonic/助记符 | 作用/Instruction | 示例 |
---|---|---|
ADC | Add with carry 在相加的时候带上进位 | ADC R0, R0, R1表示R0 = R0 + R1 + C |
ADD | Add 两数相加 | ADC R0, R0, R1表示R0 = R0 + R1 |
RSB | Reverse subtract 逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中 | rsb r0,r1,r2表示r0 = r2 - r1 |
RSC | Reverse subtract with Carry 逆向减法指令并加上carry 把操作数2减去操作数1,再减去CPSR中的C取反,并将结果存放到目的寄存器中 | rsc r0,r1,r2表示r0 = r2 - r1 - !C |
SUB | Subtract 减法指令 | |
SBC | Subtract with Carry 减法指令再减去CPSR中的C取反。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。 | SBCS r0,r1,r2 表示r0 = r1 - r2 - !c |
AND | And 两数相与 | AND R0, R0, R1表示R0和R1相与结果保存在R0中 |
EOR | 异或 | EOR R0, R0, R1表示R0和R1异或结果保存在R0中 |
ORR | OR 或 | |
BIC | bit clear 复位 | BLC R0,R0,#0x000f表示 R0的低4位置零(R0 = R0 & (~0x000f)) |
CMN | Compare Negative 两数相加分析结果 | CMN R1,R2表示 结果 = R1 + R2 1. 结果 =R0[31] 2.Z=(if 结果==0 then 1 else 0) 3.C=NOT BorrowFrom(R1 + R2) 4.V=OverflowFrom(R1+R2) |
CMP | Compare 两数相减分析结果 | CMN R1,R2表示 结果 = R1 - R2 1. N =结果[31] 2.Z=(if 结果==0 then 1 else 0) 3.C=NOT BorrowFrom(R1 - R2) 4.V=OverflowFrom(R1-R2) |
MLA | Multiply accumulate 乘累加指令 | MLA R0,R1,R2,R3表示 R0 = R1 * R2 + R3 |
MUL | Multiply 乘法指令 | MLA R0,R1,R2表示 R0 = R1 * R2 |
SWP | Swap register with memory |
tips:
ARM做减法时,C值的设置规则和加法相反,即:当运算结果产生了借位时,C=0,否则C=1.因此在SBC指令中,C要取反
(2)跳转指令
指令/Mnemonic/助记符 | 作用/Instruction | 示例 |
---|---|---|
B | Branch 不会返回的跳转 | B halt表示相对跳转到halt标号,不会在lr寄存器中保存PC指针 |
BL | Branch with link 可以返回的跳转 | BL printf表示跳转到printf函数并把当前PC保存到LR寄存器中 |
BX | Branch and exchange BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令 | \ |
(3)协处理器相关指令
指令/Mnemonic/助记符 | 作用/Instruction | 示例 |
---|---|---|
CDP | Coprocessor data processing 协处理器数据操作指令 | \ |
LDC | Load coprocessor from memory 协处理器数据处理指令 | \ |
MCR | Move CPU register to coprocessor register ARM寄存器到协处理器寄存器的数据传送 | \ |
MRC | Move from coprocessor register toCPU register 协处理器寄存器到ARM寄存器的数据传送 | \ |
STC | Store coprocessor register to memory |
(4)数据转移指令
指令/Mnemonic/助记符 | 作用/Instruction | 示例 |
---|---|---|
LDM | Load multiple registers 将内存中堆栈内的数据,批量的赋值给寄存器,即出栈操作 | ldmia sp, {fp, sp, pc} 表示执行完此命令后sp的值给fp,sp加4的值给sp(执行过程中不会改变sp的值),sp再次加4的值给pc |
STM | Store Multiple 将寄存器中的数据批量赋值到内存中,即入栈操作 | stmdb sp!, {fp, ip, lr, pc} 表示pc的值复制到sp;然后sp减4,ip的值复制到sp;然后sp减4,lr的值复制到sp;然后sp减4,pc的值复制到sp。“!”表示sp在执行此指令的时候会被修改。 |
LDR | Load register from memory 将内存中的数据赋值到寄存器 | ldr pc, [pc, #20]表示把pc+20的为地址的值赋值给pc;ldr r0,=0x01表示把0x01赋值给r0; ldr r0,0x1234 表示把0x1234地址表示的值复制到r0 |
STR | Store register to memory将寄存器中的值赋值到内存 | STR R0,[R1,#8] 表示将r0的值赋值到r1+8所在内存中的值作为地址的地方 |
MOV | Move register or constant 移动寄存器或常量 | MOV R0, R1表示把R1赋值到R0;MOV R0 #0x01表示R0 = 0x01。注意的是要赋值立即数,立即数不能超过8位。 |
MVN | Move negative register 将寄存器或者立即数按位取反在移动 | mvn r0 0x00000001执行结果:r0 = 0xfffffffe |
MRS | Move PSR status/flags to register 读取psr的值 | mrs r0, cpsr 表示读取cpsr中的值 |
MSR | Move register to PSR status/flags写入到psr | msr cpsr, r0 表示写回到cpsr |
tips:
db(Decrement Before):先减后存
ib(Increment Before):先增后存
da(Decrement After):先存后减
ia(Increment After):先存后增
(5)异常处理指令
指令/Mnemonic/助记符 | 作用/Instruction | / |
---|---|---|
SWI | Software Interrupt 系统中断 | |
TEQ | Test bitwise equality | CPSR flags: = Rn EOR Op2 |
TST | Test bits | CPSR flags: = Rn AND Op2 |