/*****************数电知识*******************/
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中执行。
原文地址:http://www.cnblogs.com/liaoyi425/p/3766511.html