数据寄存器

学_汇编语言_王爽版 要点采集笔记(未完待续...)

。_饼干妹妹 提交于 2020-02-02 19:06:12
第一章 基础知识 存储器(内存)存放CPU工作的指令和数据(CPU可以直接使用的信息在内存中存放);指令和数据都是二进制数没有任何区别,由CPU决定是数据还是指令 内存单元:存储器被分为若干个存储单元,并从0开始编号(存储单元的地址),一个存储单元为1字节(8bit) CPU的读写 总线逻辑上分为:地址总线、数据总线、控制总线 地址总线:地址线宽度决定了CPU的寻址能力,计算方式 :2^[地址线宽](个内存单元) 数据总线:决定了CPU和外界的数据传输速度(8根数据总线可传送一个8位(bit)二进制数,即1个字节) 控制总线:是各外部器件的不同控制线的集合 CPU进行数据读写必须经过3类信息交互: ①存储单元的地址(地址信息)②器件的选择,读或写的命令(控制信息)③读或写的数据(数据信息) 读:CPU在内存中读取数据时,要先指定存储单元的地址(你要找一个地方先要确定一个地址),会把要读取的地址经过地址总线发给内存;同时CPU控制器将内存读命令通过控制总线发送给内存,并通知内存要读取数据;最后内存将被指定的内存单元中的数据经过数据总线送入CPU 写:与读类似,CPU经地址线发送要操作的内存单元的地址,CPU经控制线将内存写命令发送至内存,并通知内存要写入数据;CPU通过数据线将数据送入指定的内存单元; 内存地址空间: 每一个外部器件都有自己的存储芯片(如显卡有显存RAM和ROM

32位Linux系统虚拟地址映射

不羁岁月 提交于 2020-02-02 12:37:02
IA32体系即Intel32位体系架构,也被称为i386、X86-32或X86。在Intel公司1985年推出的80386微处理器中首先使用。用以取代之前的X86-16位架构,包括8086、80186、80286芯片。谈到这儿,就不得不说说X86架构的发展历史。 Intel 8086是由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。8086是16位CPU,数据总线16条,地址总线20条,能保存的地址的大小是2^20=1M。 8086增加了4个段寄存器用来保存各内存段的起始地址,这4个段寄存器分别为CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(扩展段寄存器)。 由于地址总线共20条,段地址有20位,但是段寄存器只有16位,不能保存20位的地址。 因此,将内存的大小划分为16的倍数(此时还没有操作系统,直接操作的是物理内存)。每块内存起始地址的后四位都为0,段寄存器只保存地址的高16位。正如前面所讲,8086时,地址总线最多只能保存1M的地址空间。 此时,物理内存=段基址+逻辑地址/偏移量。 此时若要取数据,就需要找到物理内存,方法为从DS寄存器中取值,左移4位,就得到了真正的起始地址(DS<<4),再加上变量在该内存段上的偏移量(IP寄存器保存了当前数据在内存段上的偏移量),就得到了数据的物理内存。 DS<<4 + IP =

单片机的中断系统

独自空忆成欢 提交于 2020-02-02 04:38:04
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。 第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源,单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。 第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。 第三、中断的响应过程:当有事件产生

乘法器的实现

巧了我就是萌 提交于 2020-02-01 06:04:01
如果希望CPU支持某一种运算,我们就需要用硬件电路来实现对应的功能部件。我们现在已经有了一种乘法运算的方法,适合硬件来进行实现。而且,我们还掌握了一些硬件电路的基本知识。我们就可以一起来尝试如何构建一个硬件的乘法器。 现在我们来看乘法器是怎么实现的。我们用一个简单的二进制乘法作为例子,1000乘以1001,这是两个四位的二进制数相乘,那么为此我们要实现一个四位的乘法器。 首先我们需要一个寄存器来保存被乘数(Multiplicand),被乘数寄存器是一个8位的寄存器,而且带有左移的功能。它有一个左移的控制信号输入,当外部的控制逻辑(Control test)将这个信号视为有效时,在下一个时钟顺延到来的时候,被乘数寄存器当中的内容就会向左移动一位。 第二个寄存器是乘积(Product)寄存器,这也是一个8位的寄存器,用来保存运算的结果。被乘数寄存器当中的内容和乘积寄存器当中的内容需要进行加法运算,这里我们就需要进行一个8位的加法器,它会将被乘数寄存器当中的内容和乘积寄存器当中的内容进行相加,并将结果再送到乘积寄存器当中。 另外,我们还需要一个寄存器来保存乘数。这个寄存器只要4位就可以了,但有一点比较特殊,乘数寄存器的最低位被连到了控制逻辑(Control test),也就说控制逻辑可以观察当前乘数寄存器的最低位,并据此来生成相关的控制信号。这些控制信号就包括是否要让加法器进行加法运算

csapp-系统栈和ROP技术

无人久伴 提交于 2020-02-01 05:19:47
前言:总结的都是基于我在计算机系统学习中的相对个人重难点。 栈帧 栈帧的内部模拟图片( 来源于百度图片 ): 图上所述结构一步一步来看: 返回地址以上部分的参数是存储在调用函数p中的栈帧中的变量值。而这个值是为下一步被调函数Q传参做准备的。需要注意的是,存在该部分的条件是因为寄存器中最多传递六个整型(即整型和指针参数)。而当传入的个数大于6时,超过六的部分参数,需要直接存储在栈帧中,并且是倒着顺序存入栈帧中(由栈顶到栈底顺序)。 补充栈上的局部存储: 1:寄存器不够存放所有的本地数据; 2:对某一个局部变量使用地址运算符“&”,必须为它产生一个地址; 3:某些局部变量数数组或者结构时。 引用《深入了解计算机系统》书上的两个例子: 第一个: 在long caller函数调用被调函数swap之前,开辟空间,将arg1和arg2先放入栈中,并且rsp存着&arg1,rsp+8存着&arg2,然后再将返回地址放入栈中,进行调用函数swap_add。 第二个 发现传入的参数的个数是8个,并且存在几个参数传入的地址,那么我们首先选出地址引用的&x1,&x2,&x3,&x4和第七个x4与第八个参数&x4.那么如上图根据“对某一个局部变量使用地址运算符“&”,必须为它产生一个地址”原则,为x1,x2,x3,x4按顺序产生地址,然后第七个和第八个参数就按照倒序的顺序存入即可x4存在rsp,

第六周学习报告

筅森魡賤 提交于 2020-02-01 02:55:32
4.1Y86指令体系结构 程序员可见状态 ISA: 一个处理器支持的指令和指令的字节级编码称为~。 冒险: 一条指令的位置或者操作数依赖于其他仍在流水线中的指令。 程序员可见状态: Y86程序中的每条指令都会读取或修改处理器状态的某些部分 =>只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐藏方式来表示和组织这个处理器状态。 Y86的处理器状态类似于IA32。 有8个程序寄存器。处理器每个程序寄存器储存一个字。寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。 有3个一位条件码:ZF,SF, OF.保存最近的算术或者逻辑指令所造成影响的有关信息。 程序计数器PC:存放当前正在执行指令的地址。 存储器:(概念上来说是一个很大的字节数组)保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。 程序状态的最后一部分状态码Stat,表明程序执行总体状态。 Y86指令 只包括四字节整数操作,所以称之为“字 ”。 Y86指令集,长度1~6字节不等。一条指令含有一个单字节的指令表示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。 字段fn:指明是某个整数操作(OPL),数据移动条件(comvxx)或是分支条件(jxx)。所有数值都使用16进制。 Y86指令的更多细节: movl指令分成了四个不同的指令irmovl,rrmovl

20145334 《信息安全系统设计基础》第六周学习

断了今生、忘了曾经 提交于 2020-02-01 02:08:04
1.程序员可见状态 Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。其中包括: 8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。 条件码:ZF(零)、SF(符号)、OF(有符号溢出) 程序计数器(PC):存放当前正在执行的指令的地址 存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。 状态码(stat):表明程序执行的总体状态。 Y86指令 movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。 整数操作指令OPl:addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。 跳转指令jXX:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。 条件传送指令cmovXX:cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。 call指令将返回地址入栈,然后跳转到目的地址

20145235 《信息安全系统设计基础》第06周学习总结 _01

霸气de小男生 提交于 2020-02-01 02:03:28
20145235 《信息安全系统设计基础》第06周学习总结 _01 4.1.4 Y86异常 关于可见状态码Stat的几个值: 1:AOK 程序执行正常 2:HLT 表示处理器执行了一条halt指令 3:ADR 表示处理器从一个非法的存储器地址读或者向一个非法的存储器地址写 4:INS 表示遇到非法指令 4.1.5 Y86程序 “.”开头的词是汇编器命令,告诉他们汇编器调整命令,以便在哪产生代码或者插入数据 P239 Y86程序结构: 声明代码产生的起始地址 (.pos 0 ) 初始化栈指针和帧指针 为代码所声明的数据开辟地址 给栈分配空间 指令模拟器,成为YIS。 模拟器只打印出在模拟过程中被改变了的寄存器或存储器中的字。左边是原始值,右边是最终值。 4.1.6 对于“pushl %esp”在上学期的汇编中有详细指明:是现将数据push,然后对指针sp进行修改;而对于“popl %esp”,是先修改指针,然后再进行pop。然而4.1.6中说是不确定的。 4.2 逻辑设计和硬件控制语言HCL 要实现数字系统,需三个主要组成部分: 计算对位进行操作的逻辑结构、存储位的存储器元素,以及控制存储器元素更新的时钟信号。 4.2.1 逻辑门 逻辑运算:&&、||、! 位运算:&、|、~ 4.2.2 组合电路和HCL布尔表达式 将很多逻辑门组合成一个网,就能构建计算快,称为组合电路。限制

处理器体系结构学习记录

笑着哭i 提交于 2020-02-01 01:16:57
重要知识点 指令集体系结构 一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。 Y86处理器 Y86处理器状态类似于IA32。有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。处理器每个程序寄存器存储一个字。寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况中,寄存器没有固定的含义或固定值。有3个一位的条件码:ZF、SF和OF,它们保存最近的算术或逻辑指令所造成影响的相关信息。程序计数器(PC)存放当前正在执行的指令地址。 Y86指令 字节 halt 0 0 nop 1 0 rrmovl rA,rB 2 0 rA rB irmovl V,rB 3 0 F rB V rmmovl rA,D(rB) 4 0 rA rB D mrmovl D(rB),rA 5 0 rA rB D OPl rA,rB 6 fn rA rB jXX Dest 7 fn Dest comvXX rA,rB 2 fn rA rB call Dest 8 0 Dest ret 9 0 pushl rA A 0 rA F popl rA B 0 rA F 注:rA、rB为寄存器标识符,V,D,为常数,Dest为地址。 Y86指令编码 整数操作编码 addl 6 0 subl 6 1 andl 6 2 xorl 6 3 分支操作编码 jmp 7

STM32的SPI问题。

做~自己de王妃 提交于 2020-01-31 09:25:56
问题描述 : 之前一直使用的单片机是LPC2109,对其SPI很熟悉。基本就是原本拿来稍作修改就用。 由于某种原因需要使用STM32,然后设备的驱动是之前写好的,只修改了一些硬件控制端口,由于硬件驱动使用到了SPI接口,而我是把SPI接口提供了出来,本来以为简单修改SPI配置到对应单片机就行了。简单看了STM3的SPI配置,轻车熟路改代码,瞬间体现了良好的接口有哈。 编译,生成目标文件,下载运行。 并没有出现预想的结果。由于之前的设备驱动是能用的,所以排除设备驱动问题。 开始以为是由于对STM32端口配置的不熟悉导致的、看手册,看别人代码,没发现问题。 debug........ 问题定在SPI代码上。查看配置,一样啊。郁闷!!! 把自己配置考到别人能用的代码中,可以使用。更加郁闷!!!! debug看寄存器。对比能运行代码寄存器状态。发现运行到一段代码的时候寄存器不同 SPI_CR 0x0043 SPI_CR 0x0002 看datasheet.OVR置位。问题应该就在这了。可是为什么呢?????? 搜此问题,此处出自 这里 溢出错误(OVR)  溢出错误表示连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。  状态标志SPIF表示的是数据传输正在进行中,它对数据的传输有较大的影响。主器件的SPIF有效由数据寄存器的空标志SPTE=0产生