㈠ arm体系将寄存器访问用load-store构实现,有什么好处
hfgcht
㈡ ARM CPU如何在寄存器不足的情况下访问局部变量
局部变量说白了就是在栈空间中的内存,就是说在没有寄存器的时候怎么访问内存,这个问题编译器基本不会让它发生。如果是自己写的汇编,那就是程序员该注意的了。在没有寄存器的时候就要先保存寄存器。
ARM指令跟X86指令差别还是非常大的,我这里找了2条指令:
寄存器间接寻址:
LDR R1,[R2] ;将R2作为地址,读数据到R1中
基址寻址:
LDR R2,[R3,#0x0F] ;将R3加0x0f作为地址,读数据到R2中
ARM就是这么访问内存的,包括外设寄存器也是这样访问的。它们是统一编址的。不像X86分开编址,用不同的指令访问内存和外设。
㈢ ARM处理器的寄存器都是程序员可访问的吗
这要看ARM处理器的开发人员是怎么编辑他的权限了,一般的程序员是只有使用权限的
㈣ ARM微处理器有哪几种基本寻址方式
ARM处理器有9种基本寻址方式:寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。
1.寄存器寻址
操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。
例如指令:
MOVR1,R2;R1←R2
SUBR0,R1,R2;R0←R1-R2
2.立即寻址
在立即寻址指令中数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。立即数要以“#”为前缀,表示16进制数值时以“0x”表示。
例如指令:
ADDR0,R0,#1;R0←R0+1
MOVR0,#0xff00;R0←0xff00
3.寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式。第2个寄存器操作数在与第1个操作数结合之前,先进行移位操作。
例如指令:
MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即R0=R2*8
ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相与操作,结果放入R1
可采用的移位操作如下:
LSL:逻辑左移(LogicalShiftLeft),寄存器中字的低端空出的位补0。
LSR:逻辑右移(LogicalShiftRight),寄存器中字的高端空出的位补0。
ASR:算术右移(ArithmeticShiftRight),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补0,否则补1
ROR:循环右移(RotateRight),由字的低端移出的位填入字的高端空出的位
RRX:带扩展的循环右移(RotateRightextendedby1place),操作数右移一位,高端空出的位用原C标志值填充。
各移位操作过程如图所示。
4.寄存器间接寻址
指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,操作数存放在存储器中。
例如指令:
LDRR0,[R1];R0←[R1](将R1中的数值作为地址,取出此地址中的数据保存在R0中)
STRR0,[R1];[R1]←R0
5.变址寻址
变址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,变址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
例如指令:
LDRR2,[R3,#4];R2←[R3+4](将R3中的数值加4作为地
址,取出此地址的数值保存在R2中)
STRR1,[R0,#-2];[R0-2]←R1(将R0中的数值减2作为地址,把R1中的内容保存到此地址位置)
6.多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送,这种寻址方式用一条指令最多可以完成16个寄存器值的传送。
例如指令:
LDMIAR0,{R1,R2,R3,R5};
7.堆栈寻址
堆栈是一种数据结构,堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”,堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元就是堆栈的栈顶。存储器生长堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈(AscendingStack)。
向下生长:向低地址方向生长,称为递减堆栈(DecendingStack)。
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈(FullStack);堆栈指针指向下一个要放入的空位置,称为空堆栈(EmptyStack)。
这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即:
满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。如指令LDMFA,STMFA等。
满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。如指令LDMFD,STMFD等。
空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。如指令LDMEA,STMEA等。
空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。如指令LDMED,STMED等。
8.块复制寻址
块复制寻址用于把一块从存储器的某一位置复制到另一位置,是一个多寄存器传送指令。例如指令:
STMIAR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向上增长。
STMDAR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。
9.相对寻址
相对寻址是变址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
例如指令:
BLROUTE1;调用到ROUTE1子程序
BEQLOOP;条件跳转到LOOP标号处
LOOPMOVR2,#2
ROUTE1
㈤ arm 寄存器的问题
是 R2 寄存器的内容为地址的存储器数据。
例如:R2 的值为 0x20001234,而存储器中地址 0x20001234 中存储的数据为 0x55AA55AA(32位),那么 LDR R1, [R2] 执行后,R1 的内容将变成 0x55AA55AA。
㈥ 关于单片机(arm)中怎样用指针访问寄存器
你的方法基本正确。
不同倍数的寄存器定义成对应的数据类型指针就可。如:
8位: *(unsigned char *)addr = value
16位: *(unsigned short *)addr = value
32位: *(unsigned int *)addr = value
㈦ 关于arm寄存器地址的问题。
奇了怪了,你是从哪边看出寄存器地址线只有4位的?!
㈧ ARM寄存器地址
简单的归纳就是,CPU要通过BUS访问的,都是统一编址的,包括内存和一些外设的寄存器之类。BUS负责address的map,并且有arbiter。
CPU能直接访问的,就是不需要编址的,例如ARM的寄存器,Cache之类。