首页 > 代码库 > ARM基础知识学习笔记
ARM基础知识学习笔记
/*****************数电知识*******************/
PN结(Positive-Negative)
三极管:BJT(双极结型三极管Bipolar Junction Transistor)
FET(场效应管Field Effect Transistor)
(单极结型) 1.MOSFET (金属氧化物半导体Metal Oxide Semiconductor FET)
2.JFET(结型Junction FET)
↓ ↓
门电路(Gate):TTL CMOS → (双稳态存储单元)锁存器(Latch),触发器(Flip-flop)
与(AND),或(OR),非(NOT)
与非(NAND) 或非(NOR)
同或(Exclusive OR),异或(Exclusive NOR)
↓ ↓
组合逻辑电路(Combinational Logic circuit) 时序逻辑电路(Sequential ~)
编码(Code),译码(Decoder)
选择,比较,运算(半加、全加)。 寄存器(Register),计数器,
RAM,ROM,CPLD
/****************计算机结构******************/
1.冯诺依曼结构:运算,存储,输入输出。数据程序统一
2.哈佛结构: 程序,数据独立
CPU :(ALU+)
register: 触发器(Flip-flop)
Cache(缓存)SRAM((双稳态触发)静态static):速度最快,集成度小,价格高(稳定)
内存 :RAM:DRAM((电容)动态dynamic random access):速度较快,集成度大,价格低(要刷新)
SDRAM (synchronous DRAM(同步))
DDR SDRAM:(双倍速率)
DDR3 SDRAM:(第三代,更低电压,更高性能)
ROM :MROM(掩膜)->PROM(熔丝)->EPROM(光)->E2PROM(电)
FLASH :NOR : 字读,字写 (快),块擦除(慢),集成低,尺寸大,价格高,可靠性好 -->Super vivi
(独立数据,地址总线,可直接读取执行)
NAND: 页读,页写(慢),块擦除(快 ),集成高,尺寸小,价格低 ,有失效块-->文件系统
(数据,地址同一总线,串行读取,加载到RAM执行) (硬盘)
硬盘
/*******************数据*******************/
十进制(Decimal):
二进制(Binary):
八进制(Octal):
十六进制(hexadecimal):
字节byte 字符 char 8
半字half word 短整型 short int 16
字word 整型 int(integer) 32
长整型 long int 32
单精度 float 32
双字(double word)双精度 double 64
结构体 struct **
数组 *** *[]
大端(big-endian):高字节-低地址
小端(little-endian):高字节-高地址
指令:CISC:复杂指令集(Complex Instruction Set Computer)
数量多,长度可变(1-15字节),20%实用,执行慢,
寻址多样,操作寄存器和内存,硬件复杂
RISC:精简指令集(Reduced Instruction Set Computer)
数量少,长度固定(4字节),执行每一条指令,执行快
简单寻址,只操作寄存器,硬件简单
流水线(pipeline):三级流水(ARM7)
LDR流水
分支流水
中断流水
五级流水(ARM9TDMI)
LDR互锁
/******************ARM处理器******************/
ARM:1.Advanced RISC Mechine技术
2.公司名,英国剑桥。
3. 处理器体系
优点:1.低功耗 2.高性能 3.RISC指令集
体系(版本version):(1996)ARMv4(arm7,8,9),(1999)ARMv5(arm10,xscale),(2001)ARMv6(arm11),
(2004)ARMv7(v7A,v7R,v7M)(arm cortex-A,R,M)
处理器(实现implementation):ARM7TDMI
ARM920TDMI (ARMxyzTDMIEJF-S)
(系列-MMU-cache-Thumb16-JTAG-快速乘法-跟踪宏单元)
(增强指令-Jazelle-向量浮点单元-可综合版本)
Cortex-M,Cortex-R,Cortex-A,
设备(芯片):S3C2440,S3C6410
开发板:mini240(友善之臂)
/******************我的ARM******************/
开发板:mini240(友善之臂)
处理器芯片:S3C2440(三星公司) CPU:ARM920T 版本体系: ARMv4
内存: HY57V561620 4Banks x 4M x 16Bit Synchronous DRAM (hynix 韩国)
Nor Flash: Am29LV160DB 2 M x 8-Bit CMOS 3.0 Volt-only Boot Sector Flash Memory(AMD)
Nand Flash: k9f2g08x0a_rev13 256M x 8 Bit NAND Flash Memory (三星公司)
模式:(七种)
用户模式(usr)user
特权模式 (Privileged Modes)
异常模式(Exception Modes)
快速中断模式(FIQ)fast interrupt request
外部中断模式(IRQ)interrupt request
管理模式(svc) supervisor
终止模式(abt) abort
未定义模式(und) undefined
系统模式(sys)system
寄存器(register) :(三十七个)
通用寄存器:R0-R13
未分组寄存器(the unbanked registers) R0-R7
分组寄存器 (the banked registers)
R8-R12(快速中断模式独立)
R13(SP(stack point)) R14(LR(link register))(各异常模式独立)
程序计数器 (program count) R15(PC)
状态寄存器:CPSR(current program status register)
SPSR(save program status register)
R13:SP堆栈指针,
R14:LR链接寄存器,1.保存子程序返回地址2.异常模式返回地址
R15:PC程序计数器
CPSR:当前程序状态寄存器
SPSR: 保存程序状态寄存器
N Z C V - - - - - - - - - - - - -I F T M4 M3 M2 M1 M0
negtiv负数 保留 IRQ禁止
zero零 FIQ禁止
carry进位(加法1) Thumb状态
借位(减法0)
overflow溢出
M4 M3 M2 M1 M0 :MODE模式控制位
10000:Usr
10001:FIQ
10010:IRQ
10011:Svr
10111:Abort
11011:Undefined
11111:System
异常:(优先级)类型 模式 偏移向量表(Vector Table)
3 FIQ中断 ->FIQ ->0x0000001c
4 IRQ中断 ->IRQ ->0x00000018
/ 保留 ->/ ->0x00000014
2 数据中止 ->Abt ->0x00000010
5 预取指中止 ->Abt ->0x0000000c
6 软件中断SWI ->Svc ->0x00000008
6 未定义指令 ->Und ->0x00000004
1 复位 ->Svr ->0x00000000
指令:编码存储格式
cond 28-31 16(15) 条件码(是否执行)
type 26-27 4() 指令类型码
I
opcode 21-24 8 指令操作码
S 20 1 是否影响状态CPSR
Rn 19-16 16 (R0-R15) 第一个操作数寄存器
Rd 12-15 16 (R0-R15) 目标寄存器
Operand2 0-11 2^12 第二个操作数
指令书写格式:
opcode + [cond] + [S] + Rd + Rn + operand2
助记符 条件执行 状态影响 目标寄存器 第一个操作数寄存器 第二个操作数
常见:
1.立即数:#3
2.寄存器:R3
3.寄存器间接:[R3] ,即R3里存放内存中的地址
数据处理
传送
MOV
MVN
移位(桶形移位器BarrelShifter),指令中附加
LSL(logic shift left)
LSR(logic shift right)
ASR 算术右移
ROR 循环右移
RRX 带扩展的循环右移
算术
ADD
ADC +Carry
SUB Rd=Rn-operand2
SBC +Carry
RSB Rd=operand2-Rn
RSC +Carry
逻辑
AND 按位与
ORR 按位或
EOR Eclusive OR按位异或
BIC BIt Clear Rd &(!eperand2)用掩码清除某些位
比较 自动更新CPSR标志位
CMP compare Rn - operand2 -->判断Z(0-相等,1-不相等)
CMN compare NOT Rn -! operand2 -->判断Z()
TST test 位测试 Rn & operand2 -->判断z(0-设置,非0-未设置)
TEQ test equal 相等测试 Rn 按位异或^ operand2 -->判断z(1-相等,0-不相等)
乘法
MUL 32位 MUL Rd,Rm,Rs Rd=Rm*Rs
MLA ADD 32位乘加 MUL Rd,Rm,Rs,Rn Rd=(Rm*Rs)+Rn Rd和Rn必须是不同的寄存器
SMULL signed MUL long 64位 SMULL Rdlo,Rdhi,Rm,Rs
SMLAL signed MLA long 64位乘加
UMULL unsigned MUL long
UMLAL ensigned MLA long
数据加载与存储指令
load-store 寄存器<-->内存
前索引
LDR R5,[R6,#0X04] LDR R5,[R6,R4,LSL #2]
自动索引
LDR R5,[R6,#0X04]!
后索引
LDR R5,[R6],#0X04
单寄存器
字节 LDRB /STRB LDRB时,读内存(任意地址)8位到Rd,高24位清零。
STRB时,Rd中的低8位保存到内存中。
半字节 LDRH /STRH
字 LSR /STR
有符号字 LSRSB /LDRSH
多寄存器
加载存储
加载
LDMIA R0!,{R6-R8} 后增 increasing after
LDMIB R0!,{R6-R8} 先增
LDMDA R0!,{R6-R8} 后减
LDMDB R0!,{R6-R8} 先减 decreasing before
堆栈操作
建栈 LDR R13,=0X90010
LDR SP,=0X90010
进栈 STMFD SP!,{R2-R4} Full Descending ==DB 先减
STMED SP!,{R2-R4}
STMFA SP!,{R2-R4}
STMEA SP!,{R2-R4} Empty Ascending
出栈 LDMFD SP!,{R2-R4} ==IA 进栈出栈相同形式。
LDMED SP!,{R2-R4}
LDMFA SP!,{R2-R4}
LDMEA SP!,{R2-R4}
交换指令
字 SWP R0,R1,[R2] [R2]->R0 ,R1->[R2]
SWP R0,R0,[R1] R0与R1指向的数据交换
字节 SWPB R0,R1,[R2]
SWPB R0,R0,[R1]
分支指令
分支:B Branch
带返回:BL Branch + Link
带状态切换:BX
带返回+状态切换 :BLX Branch + Link + exchange
程序状态寄存器访问指令
读 MRS R0,CPSR/MRS R0,SPSR CPSR->R0
写 MSR CPSR_c,R0 R0->CPSR,仅修改cpsr中的控制位域
软件中断
SWI SoftWare Interrupt
SWI 0X02
伪指令
ARM伪指令
ADR 小范围
ADRL 中等范围
LDR 大范围地址读取
NOP 空操作
数据定义伪指令
DCB 字节 str DCB "hello",0,"world",0
DCW 半字
DCD 字 num DCD 10,20,30
DCQ 双字
DCFS Single Float
DCFD Double Float
报告伪指令
ASSERT(flag)
汇编控制伪指令
IF ELSE
杂项伪指令
EQU NUM EQU 12
ENTRY
END
ARM程序设计
数据处理:1.立即数 2.寄存器 3.寄存器间接 4.寄存器移位
基本结构:
1、顺序
2、条件
条件判定:cmp影响nzcv
无符号数的判定: 有符号数的判定:
EQ: == EQ: ==
NE: != NE: !=
HI: > GT: >
LO: < LT: <
HS: >= GE: >=
LS: <= LE: <=
1.简单单分支if
2.二分支if() else
3.多分支switch()
{
case
}
3、循环
a.计数控制:(1)0->n
MOV Rn, #N
...
loop
...
SUBS Rn, Rn, #1
BGT loop
(2) n->0
MOV Rn, #0
...
loop
...
ADD Rn, Rn, #1
CMP Rn, #N
BNE loop
b.条件控制
单重循环
多重循环
4.子程序调用
BL pro --- MOV PC,LR
C和汇编混合编程
C《=汇编
过程点用标准:ATPCS(ARM-Thumb Produce Call Standard)
2007 AAPCS(ARM Architecture Produce Call Standard)
armcc,armcpp支持ARM指令集
tcc,tcpp支持Thumb指令集
1.参数:R0-R3 (a1-a4),超过四个参数用数据栈传递参数(复杂,慢,尽量少用)。
32位用R0返回。64位用R0和R1返回
2.通用变量寄存器:R4-R8(v1-v5)
3.数据栈为FD类型。8字节对齐
__asm
{
loop:指令
…… //注释
b loop
}
注意:1.操作数可以是寄存器(最好用变量名取代),常量,C表达式。
(unsigned) char ,short,int(寄存器受限)
2.立即数#可以省略
3.标号用C风格(loop:),不需要顶个写。
4. 注释用C风格。
5.不能给PC赋值,只能B,BL实现跳转,只B能用C风格标号。
6.LDM,STM只允许物理寄存器。
7.不支持LDR Rn,=expression.只能用MOV Rn ,expression.不支持ADR,ADRL,DCD等伪指令。
汇编访问C全局变量:
IMPORT globvar
LDR R1,=globvar
LDR R0,[R1]
……
C调用汇编(函数)
C中:extern 函数声明
汇编中:EXPORT +标号
MOV PC,LR 声明该段为外部实用。
入口在main,汇编中没有ENTRY,两文件不能重名。
export ***
AREA ***, CODE, READONLY
***:
指令
ldmfd sp, {v1};取第五个参数,只是到堆栈上取值,不要修改堆栈指针
……
mov pc,lr
END
汇编中调用C函数。
汇编中:IMPORT *** 声明实用外部函数。
mov r0,#3 …… 调用前设置参数。
stmfd sp!, {r8};传递第五个参数
bl *** 用bl跳转到c函数。
C中:
入口在ENTRY,C中没有main。
GNU ARM:
ARMASM:ARM公司自成汇编体系。codewarrior为arm标准。
GNU ARM ASM :GNU工具的arm版本。用于交叉编译成在arm中执行。