数据寄存器

《操作系统真象还原》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

汇编基础知识

帅比萌擦擦* 提交于 2019-12-04 11:26:14
1: 数据的表示 微型计算机的字长与微处理器的寄存器位数有关。 以 Intel 80X86 系列微处理器为例,CPU 是 8086/8088、80286 的字长是 16 位(二进制位 bit),那么它们的寄存器的位数一定是 16 位的; 32 位字长的微机 CPU 是 80386/80486 或者 Pentium 系列,它们的寄存器的位数则是 32 位的。 学习汇编语言我们会用到十六进制(H)的数据形式,要使自己尽快习惯用十六进制来思维。在汇编语言中,数值后面分别用字母 B 、 H 、 D 代表二进制(Binary)、十六进制(Hexadecimal)、十进制数(Decimal)(十进制数可以省略 D )。 在计算机中还规定采用字节、字、双字等单位来表示数据。 字节(Byte):8 位二进制数。如 00000101B 或表示成 05H ; 10000101B 或表示成 85H 。 字(Word):16 位二进制数,等于 2 字节。如 1100010111010110B 或表示成 C5D6H 。 双字(Double Word):32 位二进制数,又称为双精度数,等于 4 字节。如 23456789H 。 2: 寄存器的分类 8086 寄存器都是 16 位的寄存器,根据用途可分为 4 种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器 (1)数据寄存器

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()(

IIC挂死问题解决过程

安稳与你 提交于 2019-12-03 20:59:59
0.环境:arm CPU 带有IIC控制器作为slave端,带有调试串口。 1.bug表现:IIC slave 在系统启动后概率挂死,导致master无法detect到slave。 猜测1:认为IIC device程序有问题 检查1:查看程序发现有可能溢出的部分,使用IIC 工具刷过量数据到slave,未出问题。 猜测2:认为IIC device寄存器进入异常状态未能恢复 检查2:检查正常IIC寄存器和异常状态IIC寄存器,未能发现问题。 猜测3:时钟分频问题 检查3:询问同事,答固定分频。 猜测4:看波形分析 检查4:波形未量到,测量波形导致通信异常,部分设备破坏,放弃该方法。 2.发现新情况:系统启动过程中如果调试串口有数据输入,问题会概率出现。如果串口没有输入则多次测试不会出现问题。 猜测1:串口中断导致IIC初始化时被打断产生问题。 检查1:删除调试串口设备树节点,发现IIC启动100%出现问题 T-T。 猜测2: 100%复现的问题和之前的概率出现的问题相同 检查2:检查寄存器,检查设备detect 表现,认为是相同问题。 3.删除调试串口,IIC受影响的原因? 删除串口设备树节点,IIC device 必出问题。 猜测1:怀疑调试串口外部硬件电平高低导致IIC外设受影响 检查1:检查原理图,未发现影响的可能性。 猜测2:怀疑串口初始化部分处理了部分IIC设备依赖的初始化

可编程渲染管线与着色器语言

有些话、适合烂在心里 提交于 2019-12-03 20:10:01
Programming pipeline & shading language 大家好,今天想给大家介绍一下可编程渲染管线和着色器语言的相关基础知识,使想上手SHADER编程的童鞋们可以快速揭开SHADER语言的神秘面纱 由于时间有限,我决定只讲三个主要方面的内容,其过程中肯定会有不详细之处,还请见谅,就算是抛砖引玉,给大家一个简单的入门引路。 本章内容总共分为三个部分 一、3D渲染管线工作流程 二、可编程管线 三、着色器语言 3D渲染管线作为整个工作流程的基础,是不可或缺的基本知识。因此,作一定的讲解是有必要的。 但作为一个回顾内容,就不会对具体的内容进行讲解,比如如何进行坐标系变换,如何进行光栅化等等。 我们仅关注的是整个工作的过程。 甚至,我们更关心的不是整个工作过程中的细节,而是我们所必须要关注的几大流程。 如下图 数据填充 当我们想实现一次渲染效果的时候,数据的提交(填充)是不可缺少的。 因此,工作流程的第一步就是要处理输入的数据。 而我们最直接的接触3D渲染流程的时机,也就是数据填充时,更确切的说,就是那一堆set数据的API。 数据填充允许我们提交我们想要的数据,比如顶点数据(如位置,法线,颜色,纹理坐标等)。常量(如世界矩阵,观察矩阵,投影矩阵,纹理因子等等)。 变换&顶点光照 在这个阶段,顶点会经过世界变换,观察变换,投影变换。 通常情况下,在顶点经过观察变换后

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上运行起来呢?" "所以还不能着急,咱们得商量商量,得把咱们的共同规则订 好,然后呢才能分头去设计软件和硬件,这样保证之后我们在碰面的时候软件和硬件能顺利的结合在一起。" 那好,这两个小伙伴就开始商量了,他们要商量的是什么呢? 就是我们要谈的指令系统体系结构。   他们要面临的计算任务并不复杂,所以只要一个很简单的计算机指令系统就可以了。 我们要设计多少指令、要设计哪些指令,首先要根据需求来确定。 那看上去我们只需要一些简单的加法。所以首先