指令寄存器

手写bootloader(手写*_*)

╄→尐↘猪︶ㄣ 提交于 2019-12-04 14:01:11
思路 1.关看门狗 2.设置时钟 3.初始化sdram 4.重定位 5.执行main .text 表示代码段 .global _start (global 表示全局标号) 关看门狗 可以调c完成disable_watch_dag 确定看门狗地址0x.... ldr r0 ,=0x... ldr 违汇编指令 mov r1,#0 str r1, [r0] 设置时钟 可以用 c clock_init() CLKDIVN 定义位置board中 ldr r0, =0x4c00001 mov r1, #0x03 0x03 分频系数 //FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 str r1,[r0] asm 如果是c,它是标志嵌入汇编 读芯片手册,调整异步模式,根据芯片具体情况 mrc 指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断 MCR{ } p15, 0, , , {, } 为协处理器将执行的操作的操作码。对于CP15协处理器来说, 永远为0b000,当 不为0b000时,该指令操作结果不可预知 作为元寄存器的ARM寄存器,其值被传< Rd>不能为PC,当其为PC时,指令操作结果不可预知送到得协处理器寄存器中 作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。

《操作系统真象还原》MBR

元气小坏坏 提交于 2019-12-04 12:04:14
  以下是读本书第三章的收获。   如何知道一个源程序的各符号(指令和变量)地址?简单来说,地址就是该符号偏移文件开头的距离,符号的地址是按顺序编排的,所以两个相邻的符号,其地址也是相邻的。对于指令来说,指令的地址=上一个指令的地址+上一个指令的大小,最初的符号地址为0,可以根据此公式推算出所有符号的地址。 section称为节,它是提供给程序员编排程序用的,我们可以将一段读取字符串的代码放在section A下,将读取硬盘的代码放进section B下,可以给A,B换成一个更具体的名字,来提高可读性。 例如,下图这段代码,将整个程序分成section code和section data两节,顾名思义,就是存放代码和数据的两个section,这样我们就很清楚地知道每部分代码是做什么用的。另一个值得注意的细节是section并不会对符号的编址用什么影响,去掉section和不去掉其实符号的地址都是一样的。 vstart用于告诉编译器,之后的符号都以某个地址为初始地址来编址。如下图,像$$的地址替换成以0x7c00为初始地址的地址,符号var1和var2的地址被替换成以0x900的地址。 当然,我们还可以通过section.节名称.start来获得在文件中真正的地址。如section.code.start值为0x0,即section code偏移文件的距离为0

DEBUG的基本命令的使用[MASM]

好久不见. 提交于 2019-12-04 11:25:50
DEBUG 的基本命令的使用 DEBUG 是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。 DEBUG 的命令都是一个字母,后跟一个或多个参数: 字母 [ 参数 ] 命令的使用中注意: ① 字母不分大小写; ② 只使用 16 进制数,没有后缀字母; ③ 分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符; ④ 每个命令只有按了回车键后才有效,可以用 Ctrl+Break 中止命令的执行; ⑤ 命令如果不符合 Debug 的规则,则将以 “error” 提示,并用 “^” 指示错误位置。 许多命令的参数是主存逻辑地址,形式是 “ 段基地址 : 偏移地址 ” 。其中,段基地址可以是段寄存器或数值;偏移地址是数值。如果不输入段地址,则采用默认值,可以是缺省段寄存器值。如果没有提供偏移地址,则通常就是当前偏移地址。 对主存操作的命令还支持地址范围这种参数,它的形式是: “ 开始地址 结束地址 ” (结束地址不能具有段地址),或者是: “ 开始地址 L 字节长度 ” 。 DEBUG命令一览: 分类 命令格式 功能简介 读写寄存器 R 显示所有寄存器的当前内容 R 寄存器名 显示和修改指定寄存器内容 RF 显示和修改标志寄存器内容 汇编和反汇编 A[ 内存地址 ] 从指定地址开始汇编指令 U[ 内存块 ]

2019年11月12日

亡梦爱人 提交于 2019-12-04 06:53:34
一、USART简介   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。   STM32 的串口资源相当丰富的,功能也相当强劲。STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 二、USART功能概述   接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。   RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。   TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。   串口外设主要由三个部分组成,分别是波特率的控制部分、收发控制部分及数据存储转移部分。   1、波特率控制   波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控制可以改变波特率。在配置波特率时

详解C中volatile关键字

五迷三道 提交于 2019-12-03 23:43:13
在PHP官网上看到一个浮点数BUG, 测试代码 。在SVN里看了一下修复方法:在变量的声明前加了个volatile关键字。不知道这个是什么意思,特意去网上查了一下,找到了这篇文章,写得不错,转载一下。 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举 例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中 断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并 不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的 优化,那么while循环就变成了死循环

CallStub相关

吃可爱长大的小学妹 提交于 2019-12-03 21:18:36
CallStub相关 调用入口 share/vm/runtime/stubRoutines.hpp // Calls to Java SimonNote: 函数指针结合typedef类型定义 typedef void (*CallStub)( address link, intptr_t* result, BasicType result_type, Method* method, address entry_point, intptr_t* parameters, int size_of_parameters, TRAPS ); // Calls to Java SimonNote: 将内存地址 转换成函数指针 CAST_TO_FN_PTR ((CallStub)(castable_address(_call_stub_entry))) static CallStub call_stub() { return CAST_TO_FN_PTR(CallStub, _call_stub_entry); } CAST_TO_FN_PTR 宏转换成 ((CallStub)(castable_address(_call_stub_entry))) share/vm/runtime/javaCalls.cpp中调用call_stub部分 StubRoutines::call_stub()(

2.4-复杂的x86指令举例

天大地大妈咪最大 提交于 2019-12-03 11:51:57
  x86作为复杂指令系统的代表,自然会有不少相当复杂的指令。 在这一节我们将会看到其中有代表性的一些例子。   串操作指令是将存储器中的数据串进行每次一个元素的操作。 所谓一个元素可以是字节或者是字。 这个串可以很长,能够达到64KB,x86提供了5种不同的串操作指令, 并且还有3种重复前缀,可以与串操作指令配合使用。 这张表就展示了这5种串操作指令和3种重复前缀。 我们来选择其中一组进行介绍。这个指令的格式非常简单,没有任何的操作数, 它的功能就是在存储器中将指定位置的一个字节单元传送到存储器的另一个指定的位置。 与它配合的经常是这个重复前缀REP, x86的体系结构中有很多种的前缀,这个前缀的 涵义是当CX寄存器的值不等于0时,就重复执行这个串操作指令。 那么很奇怪的是这个指令没有任何操作数。其实大家要注意x86当中有很多 这样的没有操作数的指令,但这并不意味着它们比那些有操作数的指令要简单。 因为它们不写操作数,不是因为没有操作数,很可能是因为操作数太多了,实在在指令中写不下, 因此它们实际上是有一些隐含的操作数。 对于这这条串传送指令,它要传送的数据串称为源串。 源串的地址默认放在DS:SI这组寄存器指向的位置。 而要传送的目的,我们称为目的串地址,默认放在 ES:DI这组寄存器指向的位置, 而要传送的串的长度则放在CX寄存器当中。 我们可以看到,虽然没有写操作数

2.1-设计自己的计算机

风格不统一 提交于 2019-12-03 11:35:25
  什么是指令系统体系结构呢? 要回答这个问题,其实非常的简单。但是想解释清楚, 也没有那么容易。我们还是从一个小故事开始吧。   有一天两个小伙伴碰了面,发现对方都很愁苦,一个就问另一个"嘿你在愁苦什么呀?" 这个说"唉呀,最近遇到了很多运算上的问题。" "运算量好大呀。"对方说,"可不是吗,我也遇到了类似的问题。" "咱们怎么解决呢?" "不如咱们一起设计一个计算机吧!" 就说好啊,两人就一拍即和。 "我们设计计算机怎么分工呢?"一个说,"我显然是软件程序员,我来编写如何运算的软件指令。" 另一个说"那正好,我是硬件工程师,我来设计计算机的硬件,主要是CPU,那咱们就分头工作吧!" "这事估计得花一年时间才能把CPU设计出来,也才能把软件 写好。真的就可以这么开始了吗?一年之后我们在碰面,怎么保证你写的软件就能在我做的CPU上运行起来呢?" "所以还不能着急,咱们得商量商量,得把咱们的共同规则订 好,然后呢才能分头去设计软件和硬件,这样保证之后我们在碰面的时候软件和硬件能顺利的结合在一起。" 那好,这两个小伙伴就开始商量了,他们要商量的是什么呢? 就是我们要谈的指令系统体系结构。   他们要面临的计算任务并不复杂,所以只要一个很简单的计算机指令系统就可以了。 我们要设计多少指令、要设计哪些指令,首先要根据需求来确定。 那看上去我们只需要一些简单的加法。所以首先

计算机组成原理——cpu

喜你入骨 提交于 2019-12-03 07:54:24
CPU的基本功能 。指令控制 。 操作控制 。时间控制 。数据加工 CPU的基本组成 。控制器 。 运算器 CPU的主要寄存器 。指令寄存器 。程序寄存器 。数据地址寄存器 。 数据缓存寄存器 。通用寄存器 。状态寄存器 —————————————————————————————————————————— 指令周期:取出一条指令并执行这条指令的时间。 指令周期常用若干个CPU周期来表示。 CPU周期称为机器周期 来源: https://www.cnblogs.com/jia03/p/11783929.html

多周期CPU设计与实现

匿名 (未验证) 提交于 2019-12-03 00:39:02
设计一个多周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下: ==> 算术运算指令 1. add rd , rs, rt (说明:以助记符表示,是汇编指令;以代码表示,是机器指令) 000000 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。 2. addi rt , rs ,immediate 000010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。 3. sub rd , rs , rt 000001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs - rt ==> 逻辑运算指令 4. ori rt , rs ,immediate 010010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。 5. and rd , rs , rt 010001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs & rt;逻辑与运算。 6. or rd , rs , rt