1625-5 王子昂 总结《2017年3月15日》 【连续第165天总结】
A. 汇编语言 第二章
B. 一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在它们之间进行数据的传送
人主要通过用指令读写寄存器来实现对CPU的控制。
8086CPU有14个寄存器,都是16位的,分别是AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
其中AX,BX,CX,DX四个寄存器通常用来存放一般性的数据,被称为通用寄存器
上一代CPU的寄存器是8位的,因此为了兼容,8086的每个通用寄存器都可以拆分成2个独立使用的8位寄存器使用:
AX=AH+AL;BX=BH+BL ...
AX的低8位构成AL寄存器,高8位构成AH寄存器。
*注意:独立使用的意思是,当对AH、AL等8位进行ADD命令时,如果发生溢出,都不会修改下一个寄存器的值而是直接丢弃
十六进制数的一位相当于二进制数的四位,这一点要牢记。
为了区分进制,十六进制数在末尾加H,二进制加B,十进制不加。
简单的汇编指令:
MOV ax,1000H //将1000H赋值给AX
ADD ax,ax //AX=AX+AX(加法,自增运算)
CPU访问内存单元时,需要先通过地址总线给出内存单元的地址。于是在传输之前,先要在内部形成这个物理地址。不同的CPU有不同的形成方法,这里讨论8086CPU。
8086CPU是16位结构的CPU,也就是说运算器一次最多可以处理16位的数据,寄存器的最大宽度为16位,内部总线的通路为16位
而8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力。那么如何让16位的寄存器给出20位的地址呢?
采用一种叫做地址加法器的结构。
CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
16位的段地址左移一位(十六进制左移一位等同二进制左移四位),即末尾置零,再加上偏移地址,即可表示二十位的所有数字
段地址的概念:表示一段(64KB)内存地址,因为偏移地址的大小是有限的(64KB),因此当段地址确定下来以后,这个物理地址的范围就确定下来了。
段寄存器:8086有4个寄存器--CS,DS,SS,ES。当CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。
CS和IP是8086CPU中两个关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器(段地址),IP为指令指针寄存器(偏移地址)
要改变CS和IP的值,不可以使用MOV,因为CPU不允许这样的命令。但有实现这样功能的指令--JMP
JMP可以同时修改CS和IP的值,只需要JMP 1000:0 ,即可为CS赋值1000,IP赋值0
也可以单独修改IP的值,要使用JMP ax,即可把ax的值赋给IP
8086机中,任意时刻,CPU将CS:IPO指向的内容当做指令执行
工作过程:①从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
②IP指向下一条指令(自动加若干值,若干值为上一条指令的宽度)
③执行指令,然后调到步骤①循环
8086机提供转移JMP指令来修改CS,IP的内容。这样就可以达到指定命令和顺序的意图了。
win10中没有debug,装dosbox太麻烦了,正好虚拟机里有xp的镜像,明天用它来做实验好了
C. 明日计划
xp的debug实验
java日志
qt安装