汇编数据处理指令笔记.docx
- 文档编号:11539710
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:20
- 大小:179.25KB
汇编数据处理指令笔记.docx
《汇编数据处理指令笔记.docx》由会员分享,可在线阅读,更多相关《汇编数据处理指令笔记.docx(20页珍藏版)》请在冰豆网上搜索。
汇编数据处理指令笔记
数据处理指令
1.数据传送(MOVMVN)
2.算术运算(ADDADCSUBSBCRSBRSC)
3.位运算(ANDORREORBIC)
4.比较测试(CMPCMNTSTTEQ)
操作码{条件码}S目标寄存器,第一源操作数,第二源操作数
1.数据传送指令无第一源操作数
2.比较测试指令无目标寄存器
3.比较测试指令不加S,结果影响NZCV
4.第一源操作数是寄存器
5.第二源操作数有:
8位图立即数,寄存器,寄存器移位
(LSL,LSR,ASR,ROR,RRX)
6.S:
1.目标寄存器为PC,CPSR=SPSR
2.目标寄存器不为PC,结果影响NZCV
7.加法,C进位,有进位,C=1,无进位,C=0
8.减法,C借位,有借位,C=0,无借位,C=1
1-10累加和
arm-linux-as-g-osum.osum.s
arm-linux-ld-e_start-osumsum.o
qemu-arm-g1234sum
arm-linux-gdbsum
最大公约数的求解
20=5X4
12=3X4
=2X4
R0=20
R1=12
R0==R1?
20!
=12
R0=R0-R1=20-12=8
R1=R1-R0=12-8=4
R0=R0-R1=8-4=4
while(R0!
=R1)
{
if(R0>=R1)
{
R0=R0–R1;
}
else
{
R1=R1–R0;
}
}
跳转指令
数据处理指令(传送,加法,减法,位运算,比较测试)
movr1,#0x56
从存储器中获得,怎么办?
加载指令:
将数据从存储器中读到寄存器
存储指令:
将处理完毕的数据(寄存器)存储回存储器
实现了寄存器与存储器之间的数据交互
单寄存器
多寄存器
单寄存器字和无符号字节的加载,存储指令
单寄存器的字加载指令
LDR{cond}Rd,<地址模式>
功能:
将指定地址单元<地址模式>的字数据读入Rd中。
单寄存器的无符号字节加载指令
LDR{cond}BRd,<地址模式>
功能:
将指定<地址模式>地址单元中的字节数据读入Rd中,
字节数据放在Rd的低8位,高24bit用0填充
<地址模式>:
数据来源
Rd:
目标寄存器
示例
LDRR1,[R2]
R2=0x20008000
R1是0x20008000地址中的数据
LDRPC,[R0,#8]
LDRBR1,[R2],#1
R2=0x200080000x56
R1=0x56
R2=R2+1=0x20008001
LDRR1,[PC,R3]
LDRR1,[R2,R3,LSL#2]
LDREQBR1,[R2,R3]
LDRR0,[R0,#8]!
@×
基址与目标寄存器不一样
单寄存器字和无符号字节存储指令
语法格式
STR{cond}Rd,<地址模式>
功能:
将Rd寄存器的字数据存储到由<地址模式>指定的地址中
STR{
功能:
将寄存器中一个字节数据保存到<地址模式>指定的地址中
Rd:
源寄存器
<地址模式>:
数据需要存储到的目标地址
示例
STRR1,[R2]
STRR1,[R2],#1
STRR1,[R2,R3]
STRBR0,[R1,R2,ASR#2]
STREQBR0,[R1,R2,LSL#2]
STRPC,[R0,#8][PC,#8]单元内容
STRR0,[R0,#8]!
@×
1.零偏移
LDRR0,[R1]//将R1指定的地址中的数据加载到R0
R0=0xe92d4800
2.[
LDRR0,[R1,#0x8];R0<-[R1+0x8]
LDRR0,[R1,#-0x20];R0<-[R1–0x20]
R0=0xe59f3060
3.[
LDRR0,[R1,R2];R0<-[R1+R2]
LDRR0,[R1,-R2];R0<-[R1-R2]
4.[
LDRR0,[R1,R2,LSL#2];R0<-[R1+R2*4]
5.[
LDRR0,[R1,#0x8]!
;R0<-[R1+0x8]R1=R1+8
1.先加载数据
2.改变基址
6.[
LDRR0,[R1,R2]!
;R0<-[R1+R2]R1=R1+R2
7.[
LDRR0,[R1,R2,LSL#2]!
;R0<-[R1+R2*4]R1=R1+R2*4
8.[
LDRR0,[R1],#0x20;R0=<-[R1]R1=R1+0x20
1.现将基址指定的数据加载到R0
2.改变基址
9.[
LDRR0,[R1],R2;R0=<-[R1]R1=R1+R2
10.[
LDRR0,[R1],R2,LSL#2;R0=<-[R1]R1=R1+R2*4
地址模式:
10:
1.无偏移量,将指定基址的数据加载到寄存器,基址不变
2.将基址+偏移量指定地址的数据加载到寄存器,基址不变
1.立即数
2.寄存器
3.寄存器移位
3.将基址+偏移量指定地址的数据加载到寄存器,基址=基址+偏移量
1.立即数
2.寄存器
3.寄存器移位
4.将基址表示的加载到寄存器,基址=基址+偏移量
1.立即数
2.寄存器
3.寄存器移位
单寄存器字和无符号字节的加载,存储指令
单寄存器半字和有符号字节的加载,存储指令
加载指令
语法格式
LDR{cond}HRd,<地址模式>
功能:
Rd<-<地址模式>,高16bit用0填充
LDR{cond}SHRd,<地址模式>
功能:
Rd<-<地址模式>,高16bit用符号位填充
LDR{cond}SBRd,<地址模式>
功能:
Rd<-<地址模式>,高24bit用符号位填充
使用示例
LDRHR1,[R0]
R0=0x20008000
R1=0x4800
LDRSHR8,[R3,#2]
LDREQHR12,[R13,#-6]
LDRSBR7,[R6,#-1]!
LDRHR3,[R9],#2
LDRSBR1,[R2],R3
LDRHPC,[R0]@×
LDRHR0,[R0],#4@×
LDRSBPC,[R0]@×
LDRSBR0,[R0],#4@×
不要以PC作为目标寄存器用在加载半字和字节的加载指令中
在基址要发生变化的指令中,基址寄存器和目标寄存器不要相同的
语法格式
STR{cond}HRd,<地址模式>
使用示例
STRHR1,[R0]
STRHR8,[R3,#2]
STREQHR12,[R13,#-6]
STRHR7,[R6,#-2]!
STRHR3,[R9],#2
STRHR1,[R2],R3
STRHPC,[R0]@×
STRHR0,[R0],#4@×
STRHR7,[R6,#-1]@?
半字读写时,指定的地址必须半字对齐,地址整除2
基址+偏移量
偏移量:
立即数(由8bit来表示),寄存器
1.零偏移
LDRSHR0,[R1]
R0<-[R1]的低16bitR0的高16bit用符号位填充
2.[
LDRHR0,[R1,#0x04]
3.[
LDRSBR0,[R1,R2]
4.[
LDRHR0,[R1,#0x08]!
5.[
LDRSBR0,[R1,R2]!
6.[
LDRSHR0,[R1],#0x4
7.[
LDRSHR0,[R1],R2
单寄存器字和无符号字节存储加载指令
地址模式:
基址+偏移量
立即数(12bit)
寄存器
寄存器移位
单寄存器半字和有符号字节存储加载指令
地址模式:
基址+偏移量
立即数(8bit)
寄存器
多寄存器存储加载指令
多寄存器加载指令LDM
LDM{cond}{addressing_mode}Rb{!
},
功能:
将Rb基址中数据加载到Reglist表示的寄存器列表中
LDMIA/STMIA后增加
LDMIB/STMIB先增加
LDMDA/STMDA后减小
LDMDB/STMDB先减小
多寄存器存储指令STM
STM{cond}{addressing_mode}Rb{!
},
cond:
条件域
addressing_mode
LDMIA/STMIAIncrementAfter(先操作,后增加)
LDMIB/STMIBIncrementBefore(先增加,后操作)
LDMDA/STMDADecrementAfter(先操作,后递减)
LDMDB/STMDBDecrementBefore(先递减,后操作)
Rb:
基址寄存器
!
:
更新基址寄存器
Reglist:
源/目标寄存器列表(可以是16个寄存器的任何子集)
^:
1.寄存器列表中没有PC寄存器:
特权模式下使用用户模式下的寄存器
2.寄存器列表中有PC寄存器,CPSR=SPSR,异常返回
R10:
基址寄存器
{R0,R1,R4}:
源操作的寄存器
STMDAR10!
,{R0,R1,R4}
LDMIAR10,{R0,R1,R4}
R0=0x20008000IB地址先增加,然后再加载数据
[0x20008000]=1
[0x20008004]=2
[0x20008008]=3
[0x2000800C]=4
[0x20008010]=5
LDMIBR0!
{R1,R2,R3,R4}
R1=2
R2=3
R3=4
R4=5
R0=0x20008010
R0=0x20008000IA地址后增加,先加载数据
[0x20008000]=1
[0x20008004]=2
[0x20008008]=3
[0x2000800C]=4
[0x20008010]=5
LDMIAR0!
{R1,R2,R3,R4}
R1=1
R2=2
R3=3
R4=4
R0=0x20008010
LDMIAR0!
{R1-R3}
LDMIBR0,{R1-R3,R7}^@xusr/sys
LDMDBSP!
{R1-R3,PC}^@xusr/sys
LDMDBR0,{R0-R2}
LDMDAR15,{R1}@x
LDMDBR0!
{R0-R2}@xRn值
LDM{cond}{addressing_mode}Rb{!
},
功能:
将Rb基址中数据加载到Reglist表示的寄存器列表中
多寄存器存储指令STM
STM{cond}{addressing_mode}Rb{!
},
IA先存储或加载数据,地址后增加
IB地址先增加,后存储或加载数据
DA先存储或加载数据,地址后减小
DB地址先减小,后存储或加载数据
多寄存器存储加载,只操作字数据
大编号寄存器存放在高地址,小编号寄存器存放在低地址
!
:
基址要更新
^:
1.寄存器列表中包括PC,CPSR=SPSR(异常模式下使用)
2.寄存器列表中不包括PC,特权模式下使用用户模式寄存器
PC不做为基址寄存器
若要更新基址,基址和目标寄存器不使用相同的寄存器
STMIAR0!
{R1-R3}
STMIASP!
{R1-R3,LR}
STMIBR0,{R1-R3,R9}^@xusr/sys
STMDBR0,{R0-R2}
STMDBR0!
{R0-R2}
STMDAR15,{R1}@x
栈的种类:
Descendingstacks(减栈)
栈向内存地址减小的方向变化
Ascendingstacks(加栈)
栈向内存地址增加的方向变化
Fullstacks(满栈)
栈指针指向的栈顶保存有效元素
Emptystacks(空栈)
栈指针指向的栈顶未保存有效元素
综合以上两种特点,有以下4种栈
FD(FullDescending)满减栈
ED(EmptyDescending)空间栈
FA(FullAscending)满加栈
EA(EmptyAscending)空加栈
STMFD(Push)[多寄存器存储-STMDB]
LDMFD(Pop)[多寄存器加载-LDMIA]
STMDB入栈
LDMIA出栈
…….
MOVR0,#0
MOVR1,#1
BLloopCPU自动将ADD指令地址存放LR
ADDR3,R4
loop:
STMFDsp!
{r4-r7,lr}
SUBR4,#1
…..
LDMFDsp!
{r4-r7,pc}
STMFD(STMDB\Push):
入栈
根据满减栈原则,先减地址,后入栈,高地址存大编号寄存器的原则,依次入栈,栈顶指针永远指向有效元素。
如果不先减地址,则将原栈顶有效元素覆盖。
LDMFD(LDMIA\Pop):
出栈
根据满减栈原则,先出栈,后加地址,依次出栈,栈顶指针永远指向有效元素。
如果不先出栈,则将丢失一个有效元素。
MRS程序状态寄存器读指令
MRS指令语法格式
MRS{cond}Rd,psr
cond条件码
Rd目标寄存器(不能是R15)
Psr程序状态寄存器(CPSR,SPSR)
MRS{
MRS{
示例:
MRSR0,CPSR;将CPSR状态寄存器读取,保存到R0中
MRSR1,SPSR;将SPSR状态寄存器读取,保存到R1中
MSR程序状态寄存器写指令
指令的语法格式如下
MSR{
MSR{
MSR{
MSR{
MRSR0,CPSR@ReadtheCPSR
BICR0,R0,#0xF0000000@CleartheN,Z,CandVbits
MSRCPSR_f,R0@UpdatetheflagbitsintheCPSR
@N,Z,CandVflagsnowallclear
MRSR0,CPSR@ReadtheCPSR
ORRR0,R0,#0x80@Settheinterruptdisablebit
MSRCPSR_c,R0@UpdatethecontrolbitsintheCPSR
@interrupts(IRQ)nowdisabled
MRSR0,CPSR@ReadtheCPSR
BICR0,R0,#0x1F@Clearthemodebits
ORRR0,R0,#0x11@SetthemodebitstoFIQmode
MSRCPSR_c,R0@UpdatethecontrolbitsintheCPSR
@nowinFIQmode
MSRCPSR_c,#0x11
00010001
模式位改为FIQ,T位ARM状态,中断都被打开
只有确定了当前IFTmode需要改成一个确定的值时,才用此方法,否则,
伪指令:
ARM伪指令不属于ARM指令集中的指令。
定义这些指令可以使ARM汇编程序设计变得更方便。
ARM伪指令可以像其他ARM指令一样使用。
汇编器会自动用一条或多条ARM指令替换ARM伪指令。
ARM的伪指令包括
ADR伪指令
ADRL伪指令
LDR伪指令(两种写法)
NOP伪指令
小范围地址加载伪指令ADR
语法格式
ADR{cond}register,expr
cond:
条件码
register:
目标寄存器,如:
R0等
expr:
地址表达式(相对于pc或寄存器)
加载地址范围
地址字对齐时:
+/-1020bytes(255×4)
地址非字对齐时:
+/-255bytes
...
ADRR1,Delay
...
Delay:
MOVR0,R14
...
...
0x20ADDR1,PC,#0x3cR1=PC+0x3C=0x28+0x3C
=0x64
...
...
0x64MOVR0,R14
...
语法格式
ADRL{cond}register,expr
cond:
条件码
register:
目标寄存器,如:
R0等
expr:
地址表达式(相对于pc或寄存器)
加载地址范围
地址字对齐时:
-256K~256K
地址非字对齐时:
-64K~64K
LDR伪指令
语法格式
LDR{cond}register,=[expr|label_expr]
从指令位置到文字池的偏移量必须小于4KB
示例
...
LDRR1,=TestData//将0x12345678的地址给R1
LDRR0,[R1]//将该地址中的数据加载到R0
...
TestData:
.word0x12345678
示例2
LDRpc,=label
语法格式
LDR{cond}register,label_expr
从指令位置到文字池的偏移量必须小于4KB
示例
...
LDRR1,TestData直接将0x12345678给R1
...
TestData:
.word0x12345678
示例2
LDRpc,jmp_table
jmp_table:
.wordfunc_addr
BL
NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。
NOP可用于延时操作。
示例
MOVR1,#0x1234
Delay:
NOP
NOP
SUBSR1,R1,#1
BNEDelay;
MOVPC,LR
LDRR0,[R1]
单寄存器存储加载
多寄存器存储加载(IAIBDADB)
栈(满减栈DBIA)
状态寄存器的读写命令
伪指令
伪操作
C和汇编的混合编程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 数据处理 指令 笔记