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

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

  1. 首先需要了解s3c2440CPU内部的寄存器有哪些:
寄存器/register作用
R0函数传入参数1
R1函数传入参数2
R2函数传入参数3
R3函数传入参数4
R4存放函数的局部变量
R5存放函数的局部变量
R6存放函数的局部变量
R7存放函数的局部变量
R8存放函数的局部变量
R9存放函数的局部变量
R10存放函数的局部变量
R11存放函数的局部变量
R12IP内部调用暂时寄存器指针
R13SP栈指针,指向栈最新数据的地址
R14LR链接寄存器指针,在函数调用和在异常处理时,存放返回地址;
r15PC程序计数器指针,存放正在执行指令的内存地址 + 8
  1. CPSR/SPSR寄存器格式:
位/Bit寄存器作用
31N/Negative如果结果是负数则置位。当用补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果是正数或零。
30Z/Zero如果结果是零则置位。Z=1表示运算的结果为零;Z=0表示运算的结果不为零。
29C/Carry*如果发生进位则置位 有4种方法影响C的值:1. 加法运算:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。2. 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出)时,C=0,否则C=1。3. 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。4. 对于其他的非加/减运算指令,C的值通常不改变。
28V/Overflow1.减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。2. 对于其它的非加/减法运算指令,V的值通常不改变。
[ 8 : 27 ]Reserved保留
7I快速中断使能位
6F中断使能位
5T状态位:切换arm指令 / thumb指令
[ 0 : 4M0 ~ M4模式位:切换不同CPU工作的模式
  1. arm指令
    (1)运算指令
指令/Mnemonic/助记符作用/Instruction示例
ADCAdd with carry 在相加的时候带上进位ADC R0, R0, R1表示R0 = R0 + R1 + C
ADDAdd 两数相加ADC R0, R0, R1表示R0 = R0 + R1
RSBReverse subtract 逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中rsb r0,r1,r2表示r0 = r2 - r1
RSCReverse subtract with Carry 逆向减法指令并加上carry 把操作数2减去操作数1,再减去CPSR中的C取反,并将结果存放到目的寄存器中rsc r0,r1,r2表示r0 = r2 - r1 - !C
SUBSubtract 减法指令
SBCSubtract with Carry 减法指令再减去CPSR中的C取反。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。SBCS r0,r1,r2 表示r0 = r1 - r2 - !c
ANDAnd 两数相与AND R0, R0, R1表示R0和R1相与结果保存在R0中
EOR异或EOR R0, R0, R1表示R0和R1异或结果保存在R0中
ORROR 或
BICbit clear 复位BLC R0,R0,#0x000f表示 R0的低4位置零(R0 = R0 & (~0x000f))
CMNCompare 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)
CMPCompare 两数相减分析结果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)
MLAMultiply accumulate 乘累加指令MLA R0,R1,R2,R3表示 R0 = R1 * R2 + R3
MULMultiply 乘法指令MLA R0,R1,R2表示 R0 = R1 * R2
SWPSwap register with memory

tips:
ARM做减法时,C值的设置规则和加法相反,即:当运算结果产生了借位时,C=0,否则C=1.因此在SBC指令中,C要取反

(2)跳转指令

指令/Mnemonic/助记符作用/Instruction示例
BBranch 不会返回的跳转B halt表示相对跳转到halt标号,不会在lr寄存器中保存PC指针
BLBranch with link 可以返回的跳转BL printf表示跳转到printf函数并把当前PC保存到LR寄存器中
BXBranch and exchange BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令\

(3)协处理器相关指令

指令/Mnemonic/助记符作用/Instruction示例
CDPCoprocessor data processing 协处理器数据操作指令\
LDCLoad coprocessor from memory 协处理器数据处理指令\
MCRMove CPU register to coprocessor register ARM寄存器到协处理器寄存器的数据传送\
MRCMove from coprocessor register toCPU register 协处理器寄存器到ARM寄存器的数据传送\
STCStore coprocessor register to memory

(4)数据转移指令

指令/Mnemonic/助记符作用/Instruction示例
LDMLoad multiple registers 将内存中堆栈内的数据,批量的赋值给寄存器,即出栈操作ldmia sp, {fp, sp, pc} 表示执行完此命令后sp的值给fp,sp加4的值给sp(执行过程中不会改变sp的值),sp再次加4的值给pc
STMStore Multiple 将寄存器中的数据批量赋值到内存中,即入栈操作stmdb sp!, {fp, ip, lr, pc} 表示pc的值复制到sp;然后sp减4,ip的值复制到sp;然后sp减4,lr的值复制到sp;然后sp减4,pc的值复制到sp。“!”表示sp在执行此指令的时候会被修改。
LDRLoad register from memory 将内存中的数据赋值到寄存器ldr pc, [pc, #20]表示把pc+20的为地址的值赋值给pc;ldr r0,=0x01表示把0x01赋值给r0; ldr r0,0x1234 表示把0x1234地址表示的值复制到r0
STRStore register to memory将寄存器中的值赋值到内存STR R0,[R1,#8] 表示将r0的值赋值到r1+8所在内存中的值作为地址的地方
MOVMove register or constant 移动寄存器或常量MOV R0, R1表示把R1赋值到R0;MOV R0 #0x01表示R0 = 0x01。注意的是要赋值立即数,立即数不能超过8位。
MVNMove negative register 将寄存器或者立即数按位取反在移动mvn r0 0x00000001执行结果:r0 = 0xfffffffe
MRSMove PSR status/flags to register 读取psr的值mrs r0, cpsr 表示读取cpsr中的值
MSRMove register to PSR status/flags写入到psrmsr cpsr, r0 表示写回到cpsr

tips:
db(Decrement Before):先减后存
ib(Increment Before):先增后存
da(Decrement After):先存后减
ia(Increment After):先存后增

(5)异常处理指令

指令/Mnemonic/助记符作用/Instruction/
SWISoftware Interrupt 系统中断
TEQTest bitwise equalityCPSR flags: = Rn EOR Op2
TSTTest bitsCPSR flags: = Rn AND Op2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值