A53是64位的 ,V8架构的 。 A53 S5P6818 uboot是不开源的 不是三星出的 授权给nexell
A9是32位的,是V7架构的。 A9EXYNOS-4412
ARM体系结构和接口技术
理论:3 天
接口技术:4天 裸机操作
7个实验
3点内容:体系结构 1.5天汇编指令集
接口技术:通过软件编程控制硬件
硬件基本原理必须看懂。
看英文硬件手册。
1、串口 IIC RTC
MAX232把串口电平转换成TTL电平 PC电平
三极管 NPN PNP
NPN 高电平导通 0.7v > 小电流控制大电流 只要压差大于0.7v就导通了
PNP 低电平导通 0.7v
三级缓存 cash 主存储器内存ram 掉电丢失 辅助存储器硬盘 rom 掉电不丢失 cpu不能直接访问
寻址空间 2的32次方 是4G ,1G给内核, 3G给用户空间 所以实际是3G 还有一G给其他用处sfp
地址总线 控制总线 数据总线
CPU只要初始化 就不需要在管了
Contex-R 实时响应 中断 在汽车电子 相机上用的多
SC200 SC系列芯片
CISC 指令的长度和周期不固定 。
RISC 指令少了,硬件就少了。功耗就少了。 指令的长度和周期是固定的长度
V7架构都是32位的,都是单周期指令
V8架构
User是非特权模式,其他的是特权模式
FIQ IRQ UNDEF ABORT SVC 是异常模式
System是非异常模式
复位才会进入 svc模式 软中断(一条指令来实现)或者复位
在特定的模式在,执行特定的代码。实现特定的功能。
公有的只有1个,私有的有多个。
Cortex -A9 有40个
A11 40-3=37个
一种模式下 少用17个 多用18个 寄存器
每个寄存器是 32位的 是没有地址的。 但是 有个编号 例如 r0 是0000 r5 0101 就是机器码
每个模式下 都有对应的栈,
51单片机是从main开始, 但是前面还有一个启动代码。
r13 是sp 指向栈顶
R14 lr 是返回函数的入口地址,(main中去执行func,lr就是保存func的返回地址,这样func运行完毕就回到main中,向下执行。)
Mov pc lr
r15 pc 就是程序计数器 存储了当前取址指令的地址
控制器就是获取PC中的值,取的pc中的地址, pc自动+4 ,会取出pc中的地址
例如在用户模式下,来了一个中断, cpsr就一个, 现在需要修改cpsr,如果没有保存的话,返回就出错了;
所以在用户模式下,来了一个中断,就需要保存cpsr,用spsr来保存,这样在中断中修改了cpsr,也没有问题,在返回用户模式,只要恢复,就可以了
N:负数=1 可以判断 两个数的大小
Z: 运算结果为0 就是1 ,否则为0
C: 加法 : 如果产生进位 C=1 否0 什么是进位?(超过32位, 低32位向高32位进)
减法: 如果产生借位, C=0 否1 什么是借位? (低32位向高32位借) 不够减了
V: 符号位 发生变化 发生变化 就是1 否0 进位或者借位 就符号位发生了变化
A53 用到64位 模式 是 m[4] m[3:0] m4=1 就是32位 m4=0 就是64位
三级流水线
PC取址流水线 ---》 译码 -----》 执行
取址 译码 执行 是三个独立的硬件 是单周期的
一条指令需要3个周期。 取址 译码 执行 3个周期
如果多个指令,好几百条指令,一起执行, 就变成单周期的
指令1 指令2 指令3 指令4 指令5
Pc
译码 pc
执行 译码 pc
执行 译码 pc
执行 译码 pc
执行 译码
执行
平均是 1个指令一个周期
Mov
mov
mov
Bl func 取址 译码 不执行 只有在执行的时候跳转 pv在下面2个周期了
mov Pc-4 保存当前的地址 lr 等func执行完毕就返回从这向下执行
mov Bl func执行的时候 pc在这里
Pc会跳转到 func中执行,func执行完毕后在回来,重新向下执行,
这样其实就浪费了2个周期的指令。
第二天
地址 机器码 汇编代码
把.bin文件反汇编成 汇编文件 .bin就是机器码 uboot就是包含调试信息的文件 uboot.bin就是二进制文件
Arm-linux-ld arm-linux-copy
<>是必须有的
{}是可有可无
Opcode 操作码
<code> 条件码 默认什么都不加,就是无条件执行
s 就是状态位: cpsr 加s就是影响 cpsr状态寄存器。 nzcv位
Operand2 可以是一个寄存器,也可以是一个立即数 还有一个是经过移位的寄存器 左移 或者右移
汇编注释 : 汇编代码中的注释 @ 单行注释 多行注释 /**/
//数据操作指令
数据搬移指令 mov mvn mov操作立即数 用ldr就行了
Mov r0,#0x1 将0x1值放到 r0中去
没有第一个操作寄存器 只有第一个操作数
Mov r1,r0
将r0的结果放到r1里面去 有目标寄存器和第一个操作寄存器,和第一个操作数
Mov r0,#0xFFFF @0xffff不是立即数,
例如:0xFF000000 能找到 0x000000FF 之后循环右移 8位变成了 0xFF000000 这样 0xFF00000就是立即数
4位 大16,需要/2 8位 大 255 8个1之内
0xFF000000 存到低八位 0xFF 存到高4位 存的是移动的偶数个数/2 =8/2=4
立即数就是有效数,
0x00001f80 可以展开 000111111000 7e 这样就变成了立即数
Mvn r0,#0x1 r0=~0x1 取反之后给r0
Ldr 伪指令: ldr r0, =0xFFFF =相当与赋值 多条指令来实现ldr的指令
周期比mov多一个
桶形移位器 ,移位操作指令
LSL 裸机左移, 无符号左移,
Mov r1,#0xff
Lsl r0,r1,#4 将r1中的值,左移4位,放到r0中。 高位移出,低位补0。
LSR 逻辑右移,无符号右移
Lsr r2,r0, #4 将r0中的值,右移4位,放到r2中。 低位移出,高位补0
ASR 算术右移 有符号的数
Asr r3,r0,#4 将r0中的值,右移4位,放到r3中。 低位移出,高位补符号位
ROR 循环右移
Ror r4,r0,#4
Mov r5,r0 ,lsl #4 把r0左移4位 放到r5中去
错误 mov r6,r0<<4 是不可以的
算术 运算指令 add adc进位 sub sbc借位 rsb 逆向 rsc带借位的逆向减法 mul乘法
普通 加法 add
Mov r1,#4
Add r0,r1,r2 add r0,r1,#3 === r2=r1+3=0x7
Add r2,r2,#3 r2=r2+3= 0x7+0x3=0xA 可以删掉一个
Add r2,#3 == add r2,r2,#3
Adc 带进位 一般是 64位 128位 96位
低32位就可以用add
高32位 需要用到 adc
Mov r0,#FFFFFFE
Mov r1,#0x2
Mov r2,#0x3
Mov r3,#0x4
Adds r4,r0,r2 @r4=r0+r1=0x1 此时cpsr的c位是 1 //必须加上s位,否则不会影响cspr里的c标志位
Adc r5,r1,r3 @r5=r1+r3=0x7 2+4+进位=7 //不需要加s 如果是96位的话 需要加s
A-b 如果a是常数 就用逆向减法指令
Adds /adc subs/sbc rsbs/rsc 指令都是同时出现的
乘法指令 mul
Mul r2, r0,r1 r2=r0*r1=0x6 //也可以合并去写 mul r2,r1
R1 不能是立即数 第二个操作数 也不能lsl 4 只能是一个寄存器
逻辑运算指令 and 与 orr或 eor 异或
Mov r1,0xff
And r2,r1,#0xf //目标寄存器 r2=r1& 0xF=0xF
或运算 orr
Orr r3 ,r1,#0xF00 //r3=r1|0xff=oxfff
异或 eor
Eor r4,r1 ,0xf0 // r4=0xf
位清除指令 bic //用的比较多 给1 就清0
Mov r1,#0xff
Bic r2,r1 ,#0xf 将0xff 的[3:0] 位清0
比较指令 cmp
Mov r1,#3
Cmp r1,#2 //没有目标寄存器 影响的 是cpsr的nzcv位 指令后面不需要加s条件。
比较大小用减法 用c来判断大小, 有c=1 就是没有借位,就是r1大 ,(=0才是有借位)
位测试指令 tst 测试某一位是否为1 //两个数与是0,z才会变1,用1去与,只有遇到0才会变1,所以
Mov r1, #0x10
Tst r1,#0x10
影响的是z 测试r1的第5位是否是1 是与运算,如果是1 ,那与出来就是1,不是0,表示r1的第5位为1,如果是0,与出来就是0,z位=1,表示第5位为0
是位与的
Teq 测试两个数是否相等
Mov r1,#3
Teq r1,#3 本质是 进行异或 运算 相同数为0 z=0
操作数必须为立即数 //都是看标志位的
Teq 异或,相同数异或为0, z=1
Tst 用1与0与, 与出来是0,z=1,表示不是1
Cmp 减法 用c来判断大小, c=1,表示没有借位,前面数大
逻辑:And 与 orr或 eor异或 //用另一个寄存器的来保存结果
移位:lsl lsr asr ror
算术:add adc sub sbc rsb rsc mul//第二个操作数只能是寄存器
搬移:mov mvn
立即数的本质是包含在指令当中的数,提升指令的效率
跳转指令 B BL //需不需要保存返回地址
Mov r0,#1
Mov r1,#2
B func //不保存 跳转指令的下一条指令的地址到LR寄存器。
//本质: 修改pc值, 将pc的值跳转到func中
Add r2,r0,r1
B stop
Func: //相当于c中的函数名
Mov r3, #3
Mov r4,#4
Add r5,r3,r4
Stop:
B stop
BL保存返回地址, 将下一条的指令地址保存到LR寄存器中
在函数内部 需要操作pc
Mov pc,lr 这样就返回到之前运行的程序中(相对执行的指令 pc-8 lr-4 mov pv,lr 就是执行的指令下一条)
Bl 与mov pc,lr 一起用
32 28 27 24 23 0
31-28 code 24-27 b/bl
2的24次方 =16M 0-23映射的地址是24位的(是相对于pc的位置发生跳转)
但是pc的后2位是不用的,所以 可以给他用2的26次方 是64m ,起始就是套到pc上
但是可以上下跳 所以是 ±32M的地址
是相当于PC的位置发生跳转
Bl 是短跳转
Ldr pc ,=0xdddddd 实现长跳转指令
条件码的使用
条件码使用
Mov r0 ,#3
Cmp r0,#2
Movhi r1,#0xf0
Movcc r2,#0x0f //执行了一部分,条件发现不成立,就不执行后面的代码
.text
.global _start
_start:
mov r0,#9
mov r1,#15
loop:
cmp r0,r1
beq stop
subhi r0,r1
subcc r1,r0
b loop
stop:
b stop
.end
Load /store 指令
单寄存器操作指令 ldr 加载出来 str 存进去 loadregister storeregister
Str r1,[r0] 【】表示把r0当作地址
Ldr r0,=0x20008000 给r0赋一个地址
Ldr r1,=0x13454553
Str s1,[r0] 将r1中的值,存放到r0指向的地址空间中
Ldr r2,[r0] 将r0指向的地址空间中的值,读取出来,存放到r2中去
Debug 中
绿色表示读 褐色表示写
Ldr是如何实现的 2 条指令周期
字节 和半字节内存操作指令 ldrb /strb ldrH / strh
索引方式
多寄存器操作指令 ldm stm mutli
StmIA IA 表示对内存操作的方式
4中方式
Increment after 默认IA
Decvement before
先增加,地址先+4 ,在把值赋入+4的地址,
先操作,地址+0, 把值赋值+0的地址中
热点新闻
学员笔记
A53是64位的 ,V8架构的 。 A53 S5P6818 uboot是不开源的 不是三星出的 授权给nexell A9是32位的,是V7架构的。 A9EXYNOS-4412 ARM体系结构和接口技术 理论:3 天 接口技术:4天 裸机操作 7个实验 3点内容:体系结构...
A53是64位的 ,V8架构的 。 A53 S5P6818 uboot是不开源的 不是三星出的 授权给nexell
A9是32位的,是V7架构的。 A9EXYNOS-4412
ARM体系结构和接口技术
理论:3 天
接口技术:4天 裸机操作
7个实验
3点内容:体系结构 1.5天汇编指令集
接口技术:通过软件编程控制硬件
硬件基本原理必须看懂。
看英文硬件手册。
1、串口 IIC RTC
MAX232把串口电平转换成TTL电平 PC电平
三极管 NPN PNP
NPN 高电平导通 0.7v > 小电流控制大电流 只要压差大于0.7v就导通了
PNP 低电平导通 0.7v
三级缓存 cash 主存储器内存ram 掉电丢失 辅助存储器硬盘 rom 掉电不丢失 cpu不能直接访问
寻址空间 2的32次方 是4G ,1G给内核, 3G给用户空间 所以实际是3G 还有一G给其他用处sfp
地址总线 控制总线 数据总线
CPU只要初始化 就不需要在管了
Contex-R 实时响应 中断 在汽车电子 相机上用的多
SC200 SC系列芯片
CISC 指令的长度和周期不固定 。
RISC 指令少了,硬件就少了。功耗就少了。 指令的长度和周期是固定的长度
V7架构都是32位的,都是单周期指令
V8架构
User是非特权模式,其他的是特权模式
FIQ IRQ UNDEF ABORT SVC 是异常模式
System是非异常模式
复位才会进入 svc模式 软中断(一条指令来实现)或者复位
在特定的模式在,执行特定的代码。实现特定的功能。
公有的只有1个,私有的有多个。
Cortex -A9 有40个
A11 40-3=37个
一种模式下 少用17个 多用18个 寄存器
每个寄存器是 32位的 是没有地址的。 但是 有个编号 例如 r0 是0000 r5 0101 就是机器码
每个模式下 都有对应的栈,
51单片机是从main开始, 但是前面还有一个启动代码。
r13 是sp 指向栈顶
R14 lr 是返回函数的入口地址,(main中去执行func,lr就是保存func的返回地址,这样func运行完毕就回到main中,向下执行。)
Mov pc lr
r15 pc 就是程序计数器 存储了当前取址指令的地址
控制器就是获取PC中的值,取的pc中的地址, pc自动+4 ,会取出pc中的地址
例如在用户模式下,来了一个中断, cpsr就一个, 现在需要修改cpsr,如果没有保存的话,返回就出错了;
所以在用户模式下,来了一个中断,就需要保存cpsr,用spsr来保存,这样在中断中修改了cpsr,也没有问题,在返回用户模式,只要恢复,就可以了
N:负数=1 可以判断 两个数的大小
Z: 运算结果为0 就是1 ,否则为0
C: 加法 : 如果产生进位 C=1 否0 什么是进位?(超过32位, 低32位向高32位进)
减法: 如果产生借位, C=0 否1 什么是借位? (低32位向高32位借) 不够减了
V: 符号位 发生变化 发生变化 就是1 否0 进位或者借位 就符号位发生了变化
A53 用到64位 模式 是 m[4] m[3:0] m4=1 就是32位 m4=0 就是64位
三级流水线
PC取址流水线 ---》 译码 -----》 执行
取址 译码 执行 是三个独立的硬件 是单周期的
一条指令需要3个周期。 取址 译码 执行 3个周期
如果多个指令,好几百条指令,一起执行, 就变成单周期的
指令1 指令2 指令3 指令4 指令5
Pc
译码 pc
执行 译码 pc
执行 译码 pc
执行 译码 pc
执行 译码
执行
平均是 1个指令一个周期
Mov
mov
mov
Bl func 取址 译码 不执行 只有在执行的时候跳转 pv在下面2个周期了
mov Pc-4 保存当前的地址 lr 等func执行完毕就返回从这向下执行
mov Bl func执行的时候 pc在这里
Pc会跳转到 func中执行,func执行完毕后在回来,重新向下执行,
这样其实就浪费了2个周期的指令。
第二天
地址 机器码 汇编代码
把.bin文件反汇编成 汇编文件 .bin就是机器码 uboot就是包含调试信息的文件 uboot.bin就是二进制文件
Arm-linux-ld arm-linux-copy
<>是必须有的
{}是可有可无
Opcode 操作码
<code> 条件码 默认什么都不加,就是无条件执行
s 就是状态位: cpsr 加s就是影响 cpsr状态寄存器。 nzcv位
Operand2 可以是一个寄存器,也可以是一个立即数 还有一个是经过移位的寄存器 左移 或者右移
汇编注释 : 汇编代码中的注释 @ 单行注释 多行注释 /**/
//数据操作指令
数据搬移指令 mov mvn mov操作立即数 用ldr就行了
Mov r0,#0x1 将0x1值放到 r0中去
没有第一个操作寄存器 只有第一个操作数
Mov r1,r0
将r0的结果放到r1里面去 有目标寄存器和第一个操作寄存器,和第一个操作数
Mov r0,#0xFFFF @0xffff不是立即数,
例如:0xFF000000 能找到 0x000000FF 之后循环右移 8位变成了 0xFF000000 这样 0xFF00000就是立即数
4位 大16,需要/2 8位 大 255 8个1之内
0xFF000000 存到低八位 0xFF 存到高4位 存的是移动的偶数个数/2 =8/2=4
立即数就是有效数,
0x00001f80 可以展开 000111111000 7e 这样就变成了立即数
Mvn r0,#0x1 r0=~0x1 取反之后给r0
Ldr 伪指令: ldr r0, =0xFFFF =相当与赋值 多条指令来实现ldr的指令
周期比mov多一个
桶形移位器 ,移位操作指令
LSL 裸机左移, 无符号左移,
Mov r1,#0xff
Lsl r0,r1,#4 将r1中的值,左移4位,放到r0中。 高位移出,低位补0。
LSR 逻辑右移,无符号右移
Lsr r2,r0, #4 将r0中的值,右移4位,放到r2中。 低位移出,高位补0
ASR 算术右移 有符号的数
Asr r3,r0,#4 将r0中的值,右移4位,放到r3中。 低位移出,高位补符号位
ROR 循环右移
Ror r4,r0,#4
Mov r5,r0 ,lsl #4 把r0左移4位 放到r5中去
错误 mov r6,r0<<4 是不可以的
算术 运算指令 add adc进位 sub sbc借位 rsb 逆向 rsc带借位的逆向减法 mul乘法
普通 加法 add
Mov r1,#4
Add r0,r1,r2 add r0,r1,#3 === r2=r1+3=0x7
Add r2,r2,#3 r2=r2+3= 0x7+0x3=0xA 可以删掉一个
Add r2,#3 == add r2,r2,#3
Adc 带进位 一般是 64位 128位 96位
低32位就可以用add
高32位 需要用到 adc
Mov r0,#FFFFFFE
Mov r1,#0x2
Mov r2,#0x3
Mov r3,#0x4
Adds r4,r0,r2 @r4=r0+r1=0x1 此时cpsr的c位是 1 //必须加上s位,否则不会影响cspr里的c标志位
Adc r5,r1,r3 @r5=r1+r3=0x7 2+4+进位=7 //不需要加s 如果是96位的话 需要加s
A-b 如果a是常数 就用逆向减法指令
Adds /adc subs/sbc rsbs/rsc 指令都是同时出现的
乘法指令 mul
Mul r2, r0,r1 r2=r0*r1=0x6 //也可以合并去写 mul r2,r1
R1 不能是立即数 第二个操作数 也不能lsl 4 只能是一个寄存器
逻辑运算指令 and 与 orr或 eor 异或
Mov r1,0xff
And r2,r1,#0xf //目标寄存器 r2=r1& 0xF=0xF
或运算 orr
Orr r3 ,r1,#0xF00 //r3=r1|0xff=oxfff
异或 eor
Eor r4,r1 ,0xf0 // r4=0xf
位清除指令 bic //用的比较多 给1 就清0
Mov r1,#0xff
Bic r2,r1 ,#0xf 将0xff 的[3:0] 位清0
比较指令 cmp
Mov r1,#3
Cmp r1,#2 //没有目标寄存器 影响的 是cpsr的nzcv位 指令后面不需要加s条件。
比较大小用减法 用c来判断大小, 有c=1 就是没有借位,就是r1大 ,(=0才是有借位)
位测试指令 tst 测试某一位是否为1 //两个数与是0,z才会变1,用1去与,只有遇到0才会变1,所以
Mov r1, #0x10
Tst r1,#0x10
影响的是z 测试r1的第5位是否是1 是与运算,如果是1 ,那与出来就是1,不是0,表示r1的第5位为1,如果是0,与出来就是0,z位=1,表示第5位为0
是位与的
Teq 测试两个数是否相等
Mov r1,#3
Teq r1,#3 本质是 进行异或 运算 相同数为0 z=0
操作数必须为立即数 //都是看标志位的
Teq 异或,相同数异或为0, z=1
Tst 用1与0与, 与出来是0,z=1,表示不是1
Cmp 减法 用c来判断大小, c=1,表示没有借位,前面数大
逻辑:And 与 orr或 eor异或 //用另一个寄存器的来保存结果
移位:lsl lsr asr ror
算术:add adc sub sbc rsb rsc mul//第二个操作数只能是寄存器
搬移:mov mvn
立即数的本质是包含在指令当中的数,提升指令的效率
跳转指令 B BL //需不需要保存返回地址
Mov r0,#1
Mov r1,#2
B func //不保存 跳转指令的下一条指令的地址到LR寄存器。
//本质: 修改pc值, 将pc的值跳转到func中
Add r2,r0,r1
B stop
Func: //相当于c中的函数名
Mov r3, #3
Mov r4,#4
Add r5,r3,r4
Stop:
B stop
BL保存返回地址, 将下一条的指令地址保存到LR寄存器中
在函数内部 需要操作pc
Mov pc,lr 这样就返回到之前运行的程序中(相对执行的指令 pc-8 lr-4 mov pv,lr 就是执行的指令下一条)
Bl 与mov pc,lr 一起用
32 28 27 24 23 0
31-28 code 24-27 b/bl
2的24次方 =16M 0-23映射的地址是24位的(是相对于pc的位置发生跳转)
但是pc的后2位是不用的,所以 可以给他用2的26次方 是64m ,起始就是套到pc上
但是可以上下跳 所以是 ±32M的地址
是相当于PC的位置发生跳转
Bl 是短跳转
Ldr pc ,=0xdddddd 实现长跳转指令
条件码的使用
条件码使用
Mov r0 ,#3
Cmp r0,#2
Movhi r1,#0xf0
Movcc r2,#0x0f //执行了一部分,条件发现不成立,就不执行后面的代码
.text
.global _start
_start:
mov r0,#9
mov r1,#15
loop:
cmp r0,r1
beq stop
subhi r0,r1
subcc r1,r0
b loop
stop:
b stop
.end
Load /store 指令
单寄存器操作指令 ldr 加载出来 str 存进去 loadregister storeregister
Str r1,[r0] 【】表示把r0当作地址
Ldr r0,=0x20008000 给r0赋一个地址
Ldr r1,=0x13454553
Str s1,[r0] 将r1中的值,存放到r0指向的地址空间中
Ldr r2,[r0] 将r0指向的地址空间中的值,读取出来,存放到r2中去
Debug 中
绿色表示读 褐色表示写
Ldr是如何实现的 2 条指令周期
字节 和半字节内存操作指令 ldrb /strb ldrH / strh
索引方式
多寄存器操作指令 ldm stm mutli
StmIA IA 表示对内存操作的方式
4中方式
Increment after 默认IA
Decvement before
先增加,地址先+4 ,在把值赋入+4的地址,
先操作,地址+0, 把值赋值+0的地址中
相关推荐
全国咨询热线:400-611-6270
?2004-2018华清远见教育科技集团 版权所有 京ICP备16055225号 京公海网安备11010802025203号