ARM指令集之Load/Store访存指令(一)

本文详细介绍了ARM指令集中关于字数据和字节数据的Load/Store指令,包括LDR、STR、LDRB、STRB等,以及用户模式下的访存指令。内容涵盖指令的功能、寻址方式以及用户模式下的特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARM有三类Load/Store指令:

  1. 操作数为32位字和无符号字节数据的Load/Store指令;
  2. 操作数为16位半字和有符号字节数据的Load/Store指令;
  3. 批量操作的Load/Store指令;

这篇笔记记录了第一类Load/Store指令的语法,这些指令包括如下:

助记符说明
LDR字数据读取指令
STR字数据写入指令
LDRB字节数据读取指令
STRB字节数据写入指令
LDRT用户模式的字数据读取指令
STRT用户模式的字数据写入指令
LDRBT用户模式的字节数据读取指令
STRBT用户模式的字节数据写入指令

所谓用户模式指令,意思是当在特权模式下执行该指令时,那么内存系统会将本次访存操作按照用户模式的权限进行判断,除此之外,和普通的对应指令并无不同。

寻址方式

上述指令遵循相同的寻址方式,如下,这些寻址方式的详细介绍见这里

语法说明
1[<Rn>, #+/-<offset_12>]立即数偏移量寻址
2[<Rn>, +/-<Rm>]寄存器偏移量寻址
3[<Rn>, +/-<Rm>, <shift>#<shift_imm>]寄存器移位偏移量寻址
4[<Rn>, #+/-<offset_12>]!立即数事先更新寻址
5[<Rn>, #+/-<Rm>]!寄存器事先更新寻址
6[<Rn>, +/-<Rm>, <shift>#<shift_imm>]!寄存器移位事先更新寻址
7[<Rn>], #+/-<offset_12>立即数事后更新寻址
8[<Rn>], +/-寄存器事后更新寻址
9[<Rm>], +/-<Rn>, <shift>#<shift_imm>寄存器移位事后更新寻址

LDR(字数据读取指令)

LDR从内存中读取一个字数据到寄存器中,如果寻址方式指定的内存地址不是字对齐的,那么从内存中读取数据后会对读取的值进行右移操作(一般要字对齐,以避免指令做移位操作,使得代码可读性降低)。

LDR{cond} <Rd>, <address_mode>

if CondPassed(cond) then
	if address[1:0] == 0b00 then
		value = Mem[address, 4]
	elif address[1:0] == 0b01 then
		value = Mem[address, 4] >> 8
	elif address[1:0] == 0b10 then
		value = Mem[address, 4] >> 16
	else
		value = Mem[address, 4] >> 24
	
	if Rd == PC then
		if (arch version 5 or above) then
			PC = value && 0xFFFF_FFFE
			T Bit = value[0]
		else
			PC = value && 0xFFFF_FFFC
	else
		Rd = value

STR(字数据写入指令)

STR将一个字数据从寄存器写入到内存中。

STR{cond} <Rd>, <address_mode>

if CondPassed(cond) then
	Mem[address, 4] = Rd

LDRB(字节数据读取指令)

LDRB会将内存单元中读取一个字节的数据到目标寄存器的低8位,同时将目标寄存器的高24位清零。

LDR{cond}B <Rd>, <address_mode>

if CondPassed(cond) then
	Rd = Mem[address, 1]

STRB(字节数据写入指令)

STRB将一个寄存器的低8位写入到指定内存单元中。

STR{cond}B <Rd>, <address_mode>

if CondPassed(cond) then
	Mem[address, 1] = Rd[7:0]

LDRT(用户模式字数据读取指令)

LDR{cond}T <Rd>, <address_mode>

if CondPassed(cond) then
	if address[1:0] == 0b00 then
		Rd = Mem[address, 4]
	elif address[1:0] == 0b01 then
		Rd = Mem[address, 4] >> 8
	elif address[1:0] == 0b10 then
		Rd = Mem[address, 4] >> 16
	else
		Rd = Mem[address, 4] >> 24

STRT(用户模式字数据写入指令)

STR{cond}T <Rd>, <address_mode>

if CondPassed(cond) then
	Mem[address, 4] = Rd

LDRBT(用户模式字节数据读取指令)

LDR{cond}BT <Rd>, <address_mode>

if CondPassed(cond) then
	Rd = Mem[address, 1]

STRBT(用户模式字节数据写入指令)

STR{cond}BT <Rd>, <address_mode>

if CondPassed(cond) then
	Mem[address, 1] = Rd[7:0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值