① 汇编语言中的STM 指令是什么意思
在TI公司DSP的汇编语言中,有STM 指令。
如:
STM #1234H, AR1
这句的意思是:向存储器存放数据。
② 汇编语言 汇编指令中 stmfd ldmfd 什么意思表示什么逻辑运算一定采纳
指令STMFD,LDMFD分析;
根据ATPCS规则,我们一般使用的FD(满降序)类型的数据栈!常用指令,STMFD和LDMFD,
ARM的堆栈操作和批量加载/存储指令的寻址模式,你就可以知道地址的指令STMFD和LDMFD计算的方法:
BR />
STMFD指令的寻址模式前降支(DB)
DB解决实际的内存地址:
start_address = RN - (Number_Of_Set_Bits_In( register_list)* 4)
结束点= RN - 4
STM指令操作的伪代码如下:
如果ConditionPassed(条件)
>
地址start_address
对于i = 0?15
如果register_list [I] == 1
存储器[地址]日
地址=地址+ 4
上述两个伪代码可以画STMFD SP!
{R0-R7,LR}伪代码如下:
SP = SP - 9×4;
= SP I = 0到7
内存[销售地址] =日
地址=地址+ 4;
内存[销售地址] = LR;
LDMFD指令后增量的方式寻址模式(IA)的伪代码的实际地址的内存IA
BR /> start_address = RN
结束点= RN +(Number_of_set_bits_in(register_list)* 4) - 4
LDM指令操作的伪代码(不考虑PC寄存器):
如果ConditionPassed(条件),然后
地址= START_ADDRESS
I = 0到15
如果register_list [我] == 1
RI =内存地址,4]
地址=地址+ 4
因此LDMFD SP! ,{R0-R7,PC} ^(站点恢复,异常处理返回)的伪代码如下:
= SP
i = 0到7 BR />
RI =内存地址,4]
地址=地址+ 4;
SP =地址;
③ ARM汇编可不可以将一个寄存器的值传给一个标号所在地址 如果可以请问如何实现。
可以,用STR指令。如:STR R0,[R1] ;把寄存器R0里的值存储到R1所指向地址单元。
还有一个批量存储指令STM,如:STMIA R0, {R2-R5} ; 把R2到R5里的内容依次存储到 R0、R0+4、R0+8、R0+12所指向的存储单元。
关于这两个指令及LDR和LDM的更多用法楼主大可用网络google一下。。。
④ 简述thumb指令集较arm指令集有哪些限制
1 thumb指令集概述
为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。
Thumb指令集是ARM指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,Thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令集而不支持ARM指令集。
当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态(CPSR的T=0:arm,T=1:thumb)。Thumb指令集并没有改变ARM体系底层的编程模型,只是在该模型上增加了一些限制条件,只要遵循一定的调用规则,Thumb子程序和ARM子程序就可以互相调用。
与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,相比之下从指令集上看thumb和arm主要有以下不同:
l 跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。
l 数据处理指令。对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器,而不是第三个寄存器。
l 单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。
l 批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0~R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序指令PC。
Thumb指令集没有包含进行异常处理时需要的一些指令,因此,在异常中断时还是需要使用ARM指令。这种限制决定了Thumb指令不能单独使用需要与ARM指令配合使用。
2 thumb寄存器和arm寄存器的关系
1)、Thumb 状态寄存器集是ARM 状态寄存器集的子集
程序员可直接访问8 个通用寄存器R0~R7、PC、堆栈指针SP、链接寄存器LR和CPSR。每个特权模式都有分组的SP、LR和SPSR。
2)、Thumb状态寄存器与ARM 状态寄存器的关系
Thumb状态寄存器与ARM状态寄存器有如下关系:
l Thumb状态R0~R7与ARM状态R0~R7相同。
l Thumb状态CPSR和SPSR与ARM状态CPSR和SPSR 相同。
l Thumb状态SP映射到ARM状态R13。
l Thumb状态LR映射到ARM状态R14。
l Thumb状态PC映射到ARM状态PC(R15)。
3)、在Thumb状态中访问高寄存器
在Thumb状态中高寄存器(寄存器R0~R7为低寄存器,寄存器R8~R15为高寄存器)不是标准寄存器集的一部分,汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。
可以使用MOV指令的特殊变量将一个值从低寄存器R0~R7转移到高寄存器R8~R15,或者从高寄存器到低寄存器。CMP指令可用于比较高寄存器和低寄存器的值。ADD 指令可用于将高寄存器的值与低寄存器的值相加。
---------------------------------------------------------------------------------------------------------------------------------
在编写Thumb指令时,先要使用伪指令CODE16声明,编写ARM指令时,则可使用CODE32伪指令声明。
1、Thumb指令集没有协处理器指令、信号量指令、以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;
2、大多数的Thumb数据处理指令采用2地址格式;
3、除了跳转指令B有条件执行功能之外,其他指令均为无条件执行,而且分支指令的跳转范围有更多限制;
4、数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果放入其中一个操作数寄存器中,而不是放入第3个寄存器中;访问寄存器R8~R15受到一定的限制,除MOV、ADD指令访问R8~R15外,其他数据处理指令总是更新CPSR中ALU状态标志,访问寄存器R8~R15的Thumb数据处理指令不能更新CPSR中的ALU状态指示。
5、Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7;
6、LDM、STM指令可以将任何范围为R0~R7的寄存器子集加载或存储;
7、PUSH、POP指令使用栈寄存器R13作为基址堆栈操作。
大多数ARM数据处理指令采用的是3地址格式(除了64位乘法指令外)。
所有异常都会使微处理器返回到ARM模式状态,并在ARM的编程模式中处理。由于ARM微处理器字传送地址必须可被4整除(即字对准),半字传送地址必须可被2整除(即半字对准)。而Thumb指令是2个字节长,而不是4个字节,所以,由Thumb执行状态进入异常时其自然偏移与ARM不同。
16位Thumb指令集是从32位ARM指令集提取指令格式的,每条Thumb指令有相同处理器模型所对应的32位ARM指令。
只要遵循ATPCS调用规则,Thumb子程序和ARM子程序就可以互相调用。
⑤ stm32f4 如何往外部存储sram写数据
STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F4系列芯片可以扩展外部SRAM用作内存。
__TM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,而且内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32扩展时,直接与SRAM芯片连接。
_蔡婊娲⑵? SRAM的存储单元以锁存器来存储数据。这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为“静态(Static)”RAM。
_栽谑导视τ贸‘现校_RAM 一般只用于 CPU 内部的高速缓存(Cache),而外部扩展的内存一般使用 DRAM。
⑥ Thumb的Thumb指令
从ARMv4T之后的ARM处理器有一种16-bit指令模式,叫做Thumb,也许跟每个条件式执行指令均耗用4位元的情形有关。
在Thumb模式下,较小的指令码有更少的功能性。例如,只有分支可以是条件式的,且许多指令码无法存取所有CPU的暂存器。然而,较短的指令码提供整体更佳的编码密度,即使有些运算需要更多的指令。特别在内存端口或总线宽度限制在32以下的情形时,更短的Thumb 指令码能更有效地使用有限的内存带宽,因而提供比32位元程式码更佳的效能。典型的嵌入式硬件仅具有较小的32-bit datapath寻址范围以及其他更窄的16 bits寻址。
Thumb指令在分支指令中一部分可以在ARM指令集之间切换,Thumb的数据处理指令都能映射到相应的
ARM数据处理指令中。但是单寄存器和多寄存器的加载和存储指令是不能相互交换的。
最早应用Thumb 技术的处理器是 ARM7TDMI系列的内核。所有 ARM9 和后来的家族,包括 XScale 都纳入了 Thumb 技术。
在编写Thumb指令时,先要使用伪指令CODE16声明,编写ARM指令时,则可使用CODE32伪指令声明。
1、Thumb指令集没有协处理器指令、信号量指令、以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制
2、大多数的Thumb数据处理指令采用2地址格式;
3、除了跳转指令B有条件执行功能之外,其他指令均为无条件执行,而且分支指令的跳转范围有更多限制;
4、数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果放入其中一个操作数寄存器中,而不是放入第3个寄存器中;访问寄存器R8~R15受到一定的限制,除MOV、ADD指令访问R8~R15外,其他数据处理指令总是更新CPSR中ALU状态标志,访问寄存器R8~R15的Thumb数据处理指令不能更新CPSR中的ALU状态指示。
5、Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7;
6、LDM、STM指令可以将任何范围为R0~R7的寄存器子集加载或存储;
7、PUSH、POP指令使用栈寄存器R13作为基址堆栈操作。 1.分支指令:跳转的范围小,除B指令外,都是无条件跳转.
2.数据处理指令:Thumb指令只有2个操作数,而ARM指令是3个操作数.
3.单寄存器加载存储指令:Thumb指令只能访问R0~R7.
4.多寄存器加载存储指令:Thumb指令只能访问R0~R7的子集.
5.Thumb特有指令:PUSH和POP作用于R13.
⑦ STM指令和LD指令有什么区别
ARM指令集中,LDR通常都是作加载指令,但是它也可以作伪指令。
初学者一般不会注意到它们的区别,其实在嵌入式开发过程中,这两条指令时非常常用的!我们应该了解他们的区别。
LDR伪指令的形式是“LDR Rn,=expr”。作用是装在一个32bit常数和一个地址到寄存器。
下面举一个例子来说明它的用法。
COUNT EQU 0x56000054
LDR R1,=COUNT
MOV R0,#0
STR R0,[R1]
COUNT是我们定义的一个变量,地址为0x56000054。
LDR R1,=COUNT 是将COUNT这个变量的地址,也就是0x56000054放到R1中。
MOV R0,#0是将立即数0放到R0中。
STR R0,[R1] 是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。
实际就是将0放到地址为0x56000054的存储单元中去。
可见这三条指令是为了完成对变量COUNT赋值。
再举一个例子
LDR R1,=COUNT ;这条伪指令,是将COUNT的地址赋给R1
LDR R0,[R1] ;将COUNT的值赋给R0
ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678 ;就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。
MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值。
原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。
另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为 mov指令的。
⑧ 求解这道嵌入式题
STMIB R4!,{R5,R6,R7}
STM为批量存储数据指令,后面的IB: 每次传送前地址加4;所以R5,R6,R7中的内容是不改变的。现在来看!号,这个表示是否更新寄存器R4。所以每传送一次之前R4就+4;PC是不变的,不要将PC与SP的功能混淆。
LDMIA R4!,{R5,R6,R7}
有了上面的理解,这个就简单了。原理是一样的,LDMIA R4!,IA表示每次传送后地址加4;由于从地址0x6000开始地址里面存储的数据没告诉,所以R5,R6,R7的值是不确定的。R4没次传送后+4;PC的值现在不好确定,如果这句汇编是与上一句的下一句,怎+4;如果只是单独理解,也不变。
注意,以上都是针对ARM状态来说的,如果是thumb状态,改为+2!
可以调试一下看看,是不是这样。