寄存器
通过操作数据总线,控制总线和地址总线实现数据的读取,肯定是非常灵活的方式,假如对某个存储单元进行比较复杂的操作,不断的进行读取显然需要优化,比如说加入缓存,事物或者中间变量什么的,当然,这里我们只能加入硬件,比如说寄存器(看来机器码会与寄存器有关)
通用寄存器:就算是将寄存器理解为存储单元里面的变量,也要为他们取一个好听且有意义的名字
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和内存:可以发现
寄存器犹如全局变量一样,显示在窗口的前方,应该不会有并发吧...
以汇编命令为一次执行循环,执行所使用的字节并不固定,汇编应该就是是对执行的一次简单的封装