arm汇编:ldr,str,ldm,stm,伪指令ldr
ldr,str,ldm,stm的命名规律:
这几个指令命名看起来不易记住,现在找找规律。
| 指令 | 样本 | 效果 | 归纳名称解释 |
| ldr Rd,addressing | ldr r1,[r0] | addressing to Rd [mem to reg] | load to register |
| str Rd,addressing | str r1,[r0] | Rd ro addressing [reg to mem] | store register |
| ldm Rn,reglist | ldmfd sp!,{r0-r7,pc} | *sp to reglist[mem to reg] | load to reglist |
| stm Rn,reglist | stmfd sp!,{r0-r7,lr} | reglist to *sp[reg to mem] | store reglist |
|
因此ldr,str,ldm,stm的命名均是以reg寄存器为主体,ld表示load装载寄存器,st表示store保存寄存器。 装载的源头、保存的去处就是内存了。 |
|||
ldr同时还是伪指令,这时必然形为: ldr reg, =expr 。expr可以是一个32位立即数,也可以是一个标号。
ldr意为大范围地址读取指令,并且读的是基于pc的相对偏移的地址值。
adr为小范围地址读取伪指令,将基于PC相对偏移的地址值读取到寄存器中。adr register,exper
可用于进行程序跳转,也可用于在数据池中查找数据。
adr r0,DispTab ;加载转换表地址到r0。
; DispTab编译后是一个固定的地址,这个地址后的空间存放了N个单位的数据。程序运行起来后的地址和编译地址或有不同。这个指令加载的是运行时的地址。
ldrb r1,[r0,r2] ;以r2的值为偏移量,读取转化表中的数据到r1中。 .... DispTab
DCB 0xc0,0xf9,0xa4,0xb0
adlr为中范围地址读取伪指令,比adr可读取的地址范围更大。
;=================
; Memory control
;=================
BWSCON EQU 0x48000000 ;Bus width & wait status
BANKCON0 EQU 0x48000004 ;Boot ROM control
BANKCON1 EQU 0x48000008 ;BANK1 control
BANKCON2 EQU 0x4800000c ;BANK2 control
BANKCON3 EQU 0x48000010 ;BANK3 control
BANKCON4 EQU 0x48000014 ;BANK4 control
BANKCON5 EQU 0x48000018 ;BANK5 control
BANKCON6 EQU 0x4800001c ;BANK6 control
BANKCON7 EQU 0x48000020 ;BANK7 control
REFRESH EQU 0x48000024 ;DRAM/SDRAM refresh
BANKSIZE EQU 0x48000028 ;Flexible Bank Size
MRSRB6 EQU 0x4800002c ;Mode register set for SDRAM Bank6
MRSRB7 EQU 0x48000030 ;Mode register set for SDRAM Bank7
;要设置的mem控制寄存器,共13个。
;*******************************************
;
;in init.s .
.
.
SetMemController
adrl r0, SMRDATA
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, # ;End address of SMRDATA ldr r3, [r0], # ;unsigned int *pValue = (unsigned int*)SMRDATA ; r3 = pValue[0] , pValue+=1;
str r3, [r1], # ;unsigned int *reg_addr = (unsigned int*)BWSCON ; *reg_addr = r3 ; reg_addr+=1;
cmp r2, r0 ;if(pValue != SMRDATA+52) {loop };
bne %B0
;end of SetMemController
.
.
.
LTORG
SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK<=75Mhz.
DCD (+(B1_BWSCON<<)+(B2_BWSCON<<)+(B3_BWSCON<<)+(B4_BWSCON<<)+(B5_BWSCON<<)+(B6_BWSCON<<)+(B7_BWSCON<<))
DCD ((B0_Tacs<<)+(B0_Tcos<<)+(B0_Tacc<<)+(B0_Tcoh<<)+(B0_Tah<<)+(B0_Tacp<<)+(B0_PMC)) ;GCS0
DCD ((B1_Tacs<<)+(B1_Tcos<<)+(B1_Tacc<<)+(B1_Tcoh<<)+(B1_Tah<<)+(B1_Tacp<<)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<<)+(B2_Tcos<<)+(B2_Tacc<<)+(B2_Tcoh<<)+(B2_Tah<<)+(B2_Tacp<<)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<<)+(B3_Tcos<<)+(B3_Tacc<<)+(B3_Tcoh<<)+(B3_Tah<<)+(B3_Tacp<<)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<<)+(B4_Tcos<<)+(B4_Tacc<<)+(B4_Tcoh<<)+(B4_Tah<<)+(B4_Tacp<<)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<<)+(B5_Tcos<<)+(B5_Tacc<<)+(B5_Tcoh<<)+(B5_Tah<<)+(B5_Tacp<<)+(B5_PMC)) ;GCS5
DCD ((B6_MT<<)+(B6_Trcd<<)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<<)+(B7_Trcd<<)+(B7_SCAN)) ;GCS7
DCD ((REFEN<<)+(TREFMD<<)+(Trp<<)+(Tsrc<<)+(Tchr<<)+REFCNT)
DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M
DCD 0x20 ;MRSR6 CL=2clk
DCD 0x20 ;MRSR7 CL=2clk
;mem设置参数值的数据池。共13*4bytes。
;********************************************************* .
.
.
arm汇编:ldr,str,ldm,stm,伪指令ldr的更多相关文章
- ARM LDR/STR, LDM/STM 指令
这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令, 关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作 ...
- arm汇编指令--str ldr
STR :把寄存器中的字保存到存储器(寄存器到存储器) 示例: STR R0,[R1],#8 :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR ...
- ARM汇编指令集3
常用ARM指令1:数据处理指令 •数据传输指令 mov mvn mov r1, r0 @两个寄存器之间数据传递 mov r1, #0xff ...
- ARM汇编1
一. 指令和伪指令 1.1. 指令 a. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行. 1.2. 伪指令 b. (汇编)伪指令本质上不是指令(只是 ...
- ARM汇编中ldr伪指令和ldr指令(转载)
转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...
- mov和ldr/str的区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
随机推荐
- 使用mongodb存取lbs数据
1,在mongodb中创建lbs_db数据库,collection名称lbs_info,要使用lbs查询功能,需要对二维数据列建立索引 db.lbs_info.ensureIndex( { locs ...
- Suricata, to 10Gbps and beyond(X86架构)
Introduction Since the beginning of July 2012, OISF team is able to access to a server where one int ...
- 利用Linux命令行进行文本按行去重并按重复次数排序
最近杂事太多,正事进展缓慢.Fighting! linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能.本文这里举例说明如何利用Linux命令行进行文本按行去重并按重 ...
- HDU 3032 Nim or not Nim? (sg函数求解)
Nim or not Nim? Problem Description Nim is a two-player mathematic game of strategy in which players ...
- strcpy_s
char src[5]="abcd"; char *des=new char[str.length(src)+1]; // length()不计\0 strcpy_s(des, ...
- 五毛的cocos2d-x学习笔记02-基本项目源码分析
class AppDelegate : private cocos2d::Application private表示私有继承,cocs2d是一个命名空间.私有继承下,Application类中的pri ...
- Mini-project # 4 - "Pong"___An Introduction to Interactive Programming in Python"RICE"
Mini-project #4 - "Pong" In this project, we will build a version of Pong, one of the firs ...
- (转)内核线程对象--Event事件对象
在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...
- 分布式session
前端用户请求经过随机分发之后,可能会命中后端任意的Web Server,并且 Web Server 也可能会因为各种不确定的原因宕机.在这种情况下,session 是很难在集群间同步的,而通过将ses ...
- IT第十一天、第十二天、第十三天 - 数组的应用、飞行棋游戏的编写和总结
NIIT第十一天 上午 多维数组 1.数组是引用数据类型 排序 1.冒泡排序法 2.类冒泡排序法 下午 飞行棋游戏 1.项目策划 2.项目规则确认 3.项目模块确认 晚上 1.飞行棋游戏,项目框架的编 ...