2.寄存器

寄存器

通过操作数据总线,控制总线和地址总线实现数据的读取,肯定是非常灵活的方式,假如对某个存储单元进行比较复杂的操作,不断的进行读取显然需要优化,比如说加入缓存,事物或者中间变量什么的,当然,这里我们只能加入硬件,比如说寄存器(看来机器码会与寄存器有关)

通用寄存器:就算是将寄存器理解为存储单元里面的变量,也要为他们取一个好听且有意义的名字
    1.数据寄存器
AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。
BH&BL=BX(base):基址寄存器,常用于地址索引
CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
DH&DL=DX(data):数据寄存器,常用于数据传递。
这4个16位的寄存器可以分为高8位(AH,BH,CH,DH)以及低八位(AL,BL,CL,DL),这2组8位寄存器可以分别寻址,并单独使用。
    2.指针寄存器和变址寄存器
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针
DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
  当然,所谓通用,就是随便改的意思,不过程序猿规范可能会要求我们按照寄存器的规则去使用(就像临时变量i一样),不遵守也没关系,但是万一控制总线不够用,可能就会按照所谓的功能来实现(好机智,就像有些jvm中,使用int代替byte...压根不提供byte相关的指令),可能其他的客户体验(优化)就没法用了(不发散了,再说就多了)- -

几条汇编指令:对总线的理解使我相信,指令这东西最好由3部组成,要不然....要不然又要学了
move ax,18;ax=18
move会转换为机器码传递给控制总线,ax是应该是地址总线(简说),而18是数据总线,so easy....
move ax,bx:ax=bx
解释同上,有个小问题就是bx并没有被删除,为什么我希望他删除,因为他是move,不是copy(我承认即使是我来实现我也不会去删,但我就是会去想,我也觉得好奇怪)
add ax,8:ax=ax+8
add为控制,ax为地址,8为数据
在看看第一章,CPU对存储器的处理,采用的上总线,上面的几个例子并没有对存储器进行读取,只是对临时变量(寄存器)进行存储,这里应该没有用到总线,我逗比了....所以,寄存器不算存储设备喽(找个台阶下O(∩_∩)O~),或许所有的存储器由奇怪的力量被映射成为物理地址(表),在这种表里没有寄存器的为止

物理地址:即便硬件众多,依然保持唯一的物理地址(具体怎么分的,交给硬件...)

16位结构的CPU:
1.运算器一次最多处理16位数据
2.寄存器最大16位
3.寄存器与运算器通道为16位

8086CPU寻找物理地址的方法
地址总线20位:存储设施被神秘力量映射为物理地址(1,2,3,4),我们可以通过地址总线找到他们,20个1能表示2的20次方个数,即物理地址的范围(多了就找不到了....)
16位结构CPU:一次蹦出来的数据就是16位,直接传给地址总线还差4位...比起物理地址=段地址x16+偏移地址,我更在乎这种公式是不是通用的,或者说万一我的地址总线就是64KB的类?再或者我32位CPU就是32为物理地址....

段的概念
既然已经决定了使用物理地址=段地址x16+偏移地址这种逗比的解决方案,就照成了物理地址有了多种表达方式,至于使用哪种...who cares

再看寄存器
寄存器做为临时变量,将会为我们保存必要数据进行存储的简化,如果逗比的物理地址寻址方式非常不方便,但是不过有个寄存器专门存放段的话....或许我就不再埋怨什么了

段寄存器:很显然,这个寄存器(变量)是作为我们简化寻址的变量的工具,根据操作方式,提供了4个非常方便的寄存器,相对于通用寄存器,改这个,很有可能不举
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器

CS和IP:IP->变量i
假设程序执行且一个字节一个字节的执行(承认吧,循环),总得有个计数的变量吧,比如ip
通过书中的例子,发现数据总线传递的数据总是不一样的...看来数据总线传递的时候就已经会做一定的解析了(可能也跟编码规则有关,who cares)

修改CS,IP:比起使用move,jmp(转移指令)提升了客户体现
jmp ax -> ip=ax
jmp 1:2 ->cs=1;ax=2;

查看CUP和内存:可以发现

寄存器犹如全局变量一样,显示在窗口的前方,应该不会有并发吧...
以汇编命令为一次执行循环,执行所使用的字节并不固定,汇编应该就是是对执行的一次简单的封装

时间: 2024-10-12 16:18:51

2.寄存器的相关文章

ARM寄存器

ARM寄存器 一.ARM工作状态下的寄存器组织 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式.但在任何时候,通用寄存器R14~R0.程序计数器PC(即R15).一个状态寄存器都是可访问的. 通用寄存器通用寄存器包括R0~R15,可以分为3类:(1)未分组寄存器R0~R7(2)分组寄存器R8~R14(3)程序计数器PC(R15) 1.未分组寄存器R0~R7在所有运

kobox : dma_s3c.ko -v1 操作寄存器方式操作S3C2440的DMA

平台:TQ2440 linux版本:Linux EmbedSky 3.16.1-svn57 #56 Sat Oct 18 21:46:22 PDT 2014 armv4tl GNU/Linux 目标:v2中改成s3c2410_dma_xxx方式来操作DMA,看这里的寄存器映射是怎么使用系统接口来操作的! #include "dma.h" #define MEM_CPY_NO_DMA 0 #define MEM_CPY_DMA 1 //#define BUF_SIZE (512*1024

寄存器调试 (2):应用层通过C代码访问(待完善)

除了前面所述通过shell命令访问寄存器外, 还支持通过C代码访问. 驱动层通过注册miscdevice设备, 实现了对应用层open/write/read等标准api的支持. static DEVICE_ATTR(dump, 0644, misc_dump_show, misc_dump_store); static DEVICE_ATTR(compare, 0644, misc_compare_show, misc_compare_store); static DEVICE_ATTR(wri

x64 寄存器使用

http://blog.csdn.net/cosmoslife/article/details/8771773 http://blog.csdn.net/herx1/article/details/3134889 x64 结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄存器.易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁.非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存. 下表说明了每种寄存器在整个函数调用

STM32 寄存器库和固件库

寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制某些 IO 口的状态,我们直 接操作寄存器: P0=0x11; 而在 STM32 的开发中,我们相同能够操作寄存器: GPIOx->BRR = 0x0011; 这样的方法当然能够,可是这样的方法的劣势是你须要去掌握每一个寄存器的使用方法.你才干正确使用 STM32,而对于 STM32 这样的级别的

被遗忘的寄存器

CPU 里有一种名为寄存器的存储电路, 相当于机器语言中的变量. 具有代表性的寄存器有以下 8 个. 各个寄存器本来都是有名字的, 但现在知道这些名字的机会已经不多了, 所以在这里顺便介绍下. AX accumulator, 累加寄存器 CX counter, 计数寄存器 DX data, 数据寄存器 BX base, 基址寄存器 SP stack pointer, 栈指针寄存器 BP base pointer, 基址指针寄存器 SI source index, 源变址寄存器 DI destin

寄存器

寄存器 多个数连加,除了一开始,以后每次都有一个中间结果参与计算,这就需要一个保存中间结果的寄存器.一个触发器可以保存一个比特.一个寄存器通常由好多个边沿D触发器组成.如下图这个寄存器包含了5个上升沿D触发器,所有能用来保存一个5比特长的二进制数. 不管一个二进制数包含多少个比特,要保存它,只需要把每一个比特都保存起来即可.所有的触发器CP端都连在一起,这样就可以接收同一个控制命令.一旦"保存"开关按下,在CP脉冲的上升沿,所有触发器同时开始干活,二进制数的每一位都在同一时间被保存起来

[转载]ARM协处理器CP15寄存器详解

用于系统存储管理的协处理器CP15  原地址:http://blog.csdn.net/gameit/article/details/13169405 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CRn,CRm,opcode2 coproc         指令操作的协处理器名.标准名为pn,n,为0~15 opcode1      协处理器的特定操作码. 对于CP15寄存器来说,

ARM处理器寄存器

参考:ARM Architecture Reference Manual的39页 1.ARM处理器寄存器纵览 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器(R13和R13_svc不是同一个寄存器),6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式.但在任何时候,通用寄存器R14-R0.程序计数器PC.一个状态寄存器都是可访问的. 1.1.通用寄存器     R0-R15     R13_svc.R14_svc

单片机特殊功能寄存器(SFR)

单片机如8051有21个SFR,地址为80H~0FFH的128个字节中,可以直接用寻址方式来操作SFR.(类似于sbit) 为了能直接访问这些SFR,keil提供饿了一种自汉族形式的定义方法.这种方法只适用于8051系列单片机进行C编程. 方法:引入关键字“sfr”,语法为:sfr sfr_name=int address 如:sfr SCON=0x98: sfr TMOD=0x89: 具体值应该参照SFR表. 关于sbit的使用有三种方式: 1.sfr PSW=0xD0://   sbit O