【s3c2440】第二课:arm汇编指令

s3c2440 arm汇编指令以及使用示例

  1. 首先需要了解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
  1. 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工作的模式
  1. 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

你可能感兴趣的:(linux)