数据寄存器

x86 汇编的基础知识

北慕城南 提交于 2020-01-31 05:33:12
x86 汇编器编程 基于x86 实现编译器首先得了解x86 平台的指令调度, 以下是一些我在实现编译器过程中用到的基础知识! 大部分内容参考了 青木的自制编译器, 基于GNU汇编器 c语言使用gcc 编译, 而gcc 编译器将c代码转化为汇编之后, 也是用的GNU as 的汇编器将汇编语言 .s 转化为.o,然后再连接, 因此如果自制编译器, 也是做到汇编这一步, 所以又得学x86 汇编器的使用方法! gcc 用的 GNU, 那我就直接使用gcc! 基本使用 编译: as hello.s //默认生成 a.out 也可以指定名字: as - o hello . o hello . s 生成目标文件后还要连接才可以执行。 gcc hello.o -o hello 最后就是 . / hello 语法 指令 指令包括 助记符 和 操作数 组成,比如 movl %esp, %ebp , movl 助记符, 后面两个为操作数, 操作数可以为多个!逗号分隔。 这个是由cpu直接执行的指令 汇编伪操作 以点 “.” 开头的, 末尾没有冒号 “:” 的 行 都是汇编伪操作行。 由汇编器执行,记录元数据和设定指令的属性。 汇编的首行缩进是没有影响的 标签 以冒号“:” 结尾的 行 都是标签行 冒号是语法, 标签名为冒号前面的值。 一般命名加上 . ,避免和代码里面的名字重复。 助记符后缀 后缀 大小

一点一点学汇编2

ε祈祈猫儿з 提交于 2020-01-30 05:54:32
寄存器 这回我们来看寄存器。CPU是由运算器,控制器,寄存器这些个器件组成。 运算器 主要负责数据的各种数据的处理工作,比如算数运算,逻辑运算; 控制器 是根据给出的相应的机器指令,发出对应的具体控制信号驱动硬件工作。它有指令译码的工作,就是根据指令寄存器的内容,产生相应的微指令; 加法指令的执行可分为:取指,计算地址,取操作数和加法运算四步,每一步都由一组微操作实现.这一组能同时执行的微操作就构成一条微指令。 寄存器 则是CPU中存储数据的部件。对于一个汇编程序员,CPU中最重要的部件就是寄存器。通过对各个寄存器数据的改变,完成对于CPU的控制。不同的CPU,寄存器的结构,数量是不同的。比如,8086CPU中有14个寄存器,名称分别是:AX,BX,CX,DX,CS,DS,ES,SS,IP,SP,BP,SI,DI,PSW。我们不在这里一一介绍每个寄存器的功能,以后用到什么寄存器,就学习什么。大体上我会按照书上的顺序来写这些寄存器。 上述这些个器件,全部集成到了一个CPU芯片中。CPU中数据的传输通过 内总线 进行。前面一篇提到了总线,那个总线是指 外总线 ,是用来连接CPU和主板上的其他部件的。 ----------------------------------------------------------------------------------------------

《操作系统真象还原》读书笔记 第3章

扶醉桌前 提交于 2020-01-30 03:20:16
0x1 地址、section、vstart 0x1.1 什么是地址 地址只是数字,描述各种符号在源程序中的位置,它是源代码文件中各符号偏移文件开头的距离。由于指令和变量所占内存大小不同,故他们相对于文件开头偏移量参差不齐。源码文件中各符号地址是由编译器来规划的。 编译器的工作就是给各符号编址。编译器根据所在硬件平台特性,将源代码中的每一个符号(指令和数据)都按照硬件平台的特性分配空间,在不考虑对齐情况下,这些符号都在空间上彼此相邻,连续分布,它们在程序中距第一个符号的距离便是他们载程序中的地址。(ps:跟文件文件偏移一个意思) 本质上,程序中各种数据结构的访问,就是通过“该数据结构的起始地址+该数据结构所占内存大小决定的”来实现的。这就解释了为什么要给出变量类型,因为变量类型规定了变量所占内存的大小,每种类型都有其对应的内存容量。 程序中定义的任何一个变量,在编译后的可执行文件中都会占据一席之地。此变量在文件中的位置是编译器来安排的。编译器无论怎么安排程序中的数据,必然有一个先后顺序,而占据第一位的数据,其地址便是整个程序的起始地址,在它后面的数据依次排开。 0x1.2 什么是section 编译器提供的关键字Section只是为了让程序员在逻辑上将程序划分成几个部分,因为它是伪指令,CPU不知道这是什么东西。一般section的应用场所是根据不同的属性人为地将程序划分几部分

S3C2440-裸机篇-08 | 使用S3C2440操作SDRAM(配置内存控制器)

删除回忆录丶 提交于 2020-01-30 03:09:13
1. 前言 提起SDRAM,大家都会觉得太难了,要编程写出SDRAM的控制时序更是难上加难,对的,没错!一年前我也是这样想的,学习这一节内容的时序觉得非常难,视频看了好几遍不太懂,对于SDRAM的控制原理更是没看懂,一年后回过头来再看视频,茅塞顿开,看不懂的原因是因为:我自己把它想的太难了,其实, 它很简单,总共也就5行代码,设置5个寄存器即可 。 简单的原因要归功于S3C2440内部的内存控制器,它的作用就是 负责向外部扩展的存储类设备提供控制信号 ,所以当CPU要去访问属于SDRAM时,只需要去访问属于SDRAM的映射地址即可,内存控制器会发出信号,控制时序去和SDRAM打交道,写入数据或者是读出数据。 尽管我们不用手写操作时序了,我们仍然要 编写程序去控制时序 。 因为S3C2440的内存控制器是普遍的,不可能只能接一种SDRAM芯片,而是所有的SDRAM芯片都可以接,但是 不同厂商的SDRAM芯片性能有差异 ,也就是说,虽然所有SDRAM芯片的控制时序都一样,但是A厂商生产的SDRAM芯片在发出控制信号之后70ns之后才有数据,B厂商生产的SDRAM芯片在发出控制信号后60ns就有有效数据,这就叫做不同的SDRAM芯片的性能不同。 所以内存控制器设置了一些寄存器, 允许用户根据实际接的SDRAM芯片性能去配置具体的时间参数即可 ,称之为SDRAM初始化或者内存控制器初始化

异常入口流程的细节

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-29 04:18:27
当异常发生时,以下的情况会随之发生: 1 压栈,并且栈指针更新; 2 处理器取出异常向量并且将其写入PC 3 寄存器更新(LR、IPSR和NVIC寄存器) 压栈 当异常发生时, 八个寄存器 会被自动压栈 这些寄存器包括R0-R3,R12,R14(链接寄存器),返回地址(下一条指令的地址或程序计数器),程序状态寄存器(xPSR)。 将寄存器R0-R3,R12,PC,LR和xPSR保存到栈中的原因是,这些寄存器被称为“ 调用者保存寄存器 ” 使用进程栈PSP ——异常发生时处理器处于线程模式并且CONTROL【1】置一, 使用主栈MSP ——对于嵌套异常,压栈时总是使用主栈,因为处理器当前处于处理模式,这种情况下只能使用主栈 ——异常发生时,处理器处于线程模式,CONTROL【1】为0,使用主栈。 C函数不需要保存这些寄存器的值,为了使异常处理能够像普通C函数一样使用,这些寄存器需要由硬件进行保存和恢复,这样在回到线程模式时,中断前的程序能够正常运行。 栈帧 ——压栈时保存到栈里的数据。 当压栈结束后,栈指针会得到更新,并且主栈指针会被选择为当前栈指针,处理模式使用的总是主栈MSP,然后异常向量也会被取出。 寄存器的压栈顺序如图 xPSR是组合状态寄存器 其中的三个寄存器之一:IPSR中断程序状态寄存器,包含了当前的中断服务程序(ISR)编号,由此可以取出异常向量。

ARM之GPIO介绍(Exynos4412平台)

耗尽温柔 提交于 2020-01-29 03:36:09
GPIO 概述 :GPIO的英文全称是General-Purpose Input/Output,也就是通用输入输出。在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO.接口至少有两个寄存器,即“通用IO控制寄存器”和“通用IO数据寄存器”。 特性 46个可中断通用控制I/O; 172个外部中断; 32个外部可唤醒中断; 252个多路复用I/O口; 睡眠模式引脚状态可控(除了GPX0,GPX1,GPH2,GPH3); GPIO常用寄存器 引脚控制寄存器(GPxCON x=A0~V4) 在exynos4412中,大多数的引脚都是功能复用的,所以必须对每个引脚进行配置。引脚控制寄存器(GPxCON)用来配置每个引脚的功能。 引脚数据寄存器(GPxDAT x=A0~V4) 如果引脚功能被配置为输出功能,可以通过向GPxDAT寄存器对应位写入数据,控制引脚输出相应电平。如果引脚被配置为输入功能,则可以从GPxDAT寄存器对应位读出数据读回的数据就是当前引脚的电平状态。 引脚上拉下拉设置寄存器(GPxPUD x=A0~V4) exynos4412芯片的内部给引脚设置了上拉电路和下拉电路,通过引脚上下拉设置寄存器控制引脚上拉电阻和下拉电阻的使能和禁止。如果引脚的上拉电阻被使能,则无论在哪种状态(输入、输出、DATAn、EINTn等其他功能)下,上拉电阻都起作用。

位带操作

隐身守侯 提交于 2020-01-28 07:34:43
本质都是操作相关寄存器来控制io口 原理映射原理 把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,通过算法使每个比特都有不同的字来替代。 比如BSSR寄存器有32个位就可以映射运算到32个字地址上去,通过改写这些地址数据来改变寄存器上的位。 编程实例 位带操作在sys.h的头文件里封装 直接使用 PAout(N)=1 (输出 1高电平 0低电平)(n为io口0——15) PAin(n)=1 (输入 1高电平 0低电平)(n为io口0——15) #define LED0 PAout(5) 宏定义LED0为PAout(5)PA io寄存器的第五io口 注 使用之前一样需要初始化 来源: CSDN 作者: qq_44726883 链接: https://blog.csdn.net/qq_44726883/article/details/103848141

闲逛计算机系统(二):说说计算机硬件系统

我怕爱的太早我们不能终老 提交于 2020-01-28 04:02:43
  上一篇《闲逛计算机系统(一):从helloworld说起》中,我们说了一个helloworld程序从编写到执行的整个过程。这篇我们来说说计算机硬件组成,然后结合helloworld程序来说明helloworld是怎样利用计算机硬件资源运行的。   首先介绍计算机的硬件组成,下面是一个IntelPentium系列的结构图:   总线     总线是贯穿整个系统的一个电子管道,用来在各个部件间传递数据信息。总线传送的字节长度是固定的,称为字。一个字中的字节数根据系统的不同而不同,在常见的32位机器上字长就是4个字节,64位机器上就是8个字节。   2.  I/O设备     I/O设备就是系统与外界世界的联系通道。一般系统包括4个I/O设备:鼠标,键盘,显示器以及磁盘设备。我们编写好的helloworld程序就放在磁盘上。     每个I/O设备都有一个控制器或者适配器与I/O总线相连。他们的功能就是在I/O设备和I/O总线之间传递信息。   3.  主存     主存就是我们平常所说的内存,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存就是由一组动态随机存取存储器芯片组成的。从逻辑上来说,主存就是一个线性的字节数组,每个字节都有一个唯一的地址。   4.  处理器     处理器是计算机的核心,是解释存储在主存中指令的引擎。处理器的核心是一个字长的存储设备

PCM data flow - 3 - ASoC codec driver

怎甘沉沦 提交于 2020-01-26 08:36:43
上一章提到codec_drv的几个组成部分,下面逐一介绍,基本是以内核文档Documentation/sound/alsa/soc/codec.txt中的内容为脉络来分析的。codec的作用,在概述中有说明,本章主要罗列下codec driver中重要的数据结构及注册流程。 Codec DAI and PCM configuration codec_dai和pcm配置信息通过结构体snd_soc_dai_driver描述,包括dai的能力描述和操作接口,snd_soc_dai_driver最终会被注册到asoc-core中。 /* * Digital Audio Interface Driver. * * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97 * operations and capabilities. Codec and platform drivers will register this * structure for every DAI they have. * This structure covers the clocking, formating and ALSA operations for each * interface. */ struct snd

GPIO及基本打通原理

寵の児 提交于 2020-01-26 07:44:07
GPIO及基本打通原理 底层驱动 I/O接口 通用IO(GPIO) GPIO输入引脚连接方式 带上拉电阻的连接 带下拉电阻的连接 “悬空”连接 GPIO输出引脚 KL25芯片 KL25芯片(80引脚封装) GPIO模块 GPIO基本编程步骤与基本打通程序 编程实例 底层驱动 指如何通过程序直接干预硬件。 I/O接口 即输入/输出接口,是MCU与外界进行交互的重要桥梁,MCU与外界的数据交换都需要通过I/O接口实现。 实质是一种电子电路,由内部若干专用寄存器和逻辑控制电路构成。 通用IO(GPIO) 是I/O的基本形式。一般情况下,使用正逻辑,规定高电平状态对应数字信号"1",低电平状态对应数字信号“0”。 当引脚作为通用输入时,MCU可以通过端口寄存器获取引脚的状态,反之,当引脚作为输出时,MCU可以通过内部寄存器控制引脚的输出状态。 GPIO输入引脚连接方式 带上拉电阻的连接 通过一个电阻连接到电源(VCC),可以设置引脚初始电平为高电平。 带下拉电阻的连接 通过一个电阻连接到地(GND)上,可以设置引脚初始电平为低电平。 “悬空”连接 一般不使用。 GPIO输出引脚 通过MCU内部程序控制引脚输出为高电平或低电平。 输出引脚O1和O2采样不同方式驱动外部器件,不同驱动电路,电流要求不同,采样不同接法。 图中当O1引脚输出为低电平时,LED点亮。 当O2引脚输出为高电平时