Skip to content

Latest commit

 

History

History
131 lines (83 loc) · 7.01 KB

学习底层知识需要懂一些硬件和汇编的基础.md

File metadata and controls

131 lines (83 loc) · 7.01 KB

对于学习硬件,或者汇编,必须掌握一些基础概念,才能深入理解学习!

一、基础概念

寄存器:嵌入到CPU中的内存,也可以理解为CPU里面的存储器,一个CPU有多个寄存器;总线:连接CPU和其它芯片的导线;总线在物理上:是一根根导线的集合;逻辑上分为:地址总线、数据总线、控制总线。

地址总线:CPU通过地址总线来指定存储单元的。根据地址总线的根数来确定最大的寻址;

数据总线:CPU与内存或其它器件的数据传送;数据总线的宽度决定了CPU和外界数据的传送速度;

控制总线:用来控制外部器件;无非就是读/写;CPU可以直接使用的信息在存储器中存放;

总结:地址总线决定CPU的寻址能力;数据总线决定一次数据传送量;控制总线决定CPU对其它器件的控制能力。

主板上有核心器件和主要器件(他们通过地址、数据、控制)总线来连接;接口卡;存储器:

  1. 读写属性分:随机存储器(RAM)、只读存储器(ROM);
  2. 功能上分类:随机存储器(RAM)、装有BIOS的ROM、接口卡上的RAM;

BIOS:主板、网卡、显卡、接口卡上都有的软件系统,通过这个可以对该硬件设备进行最基本的输入输出。

内存地址空间:最终运行程序的是CPU,所以用汇编编程的时候,必须要从CPU的角度来考虑问题;计算机内部都是从0开始的;任何的指令、命令、数据,在计算机中都为二进制;

二、CPU的内部工作原理

CPU由运算器、控制器、寄存器等组成;

8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

8086CPU所有的寄存器都是16位的,可以存放2个字节;AX、BX、CX、DX通常用来存放一般性数据,所以被称为通用寄存器;AX可以分为:AH和AL;分高8位和低8位;BX、CX、DX也一样分高低位。

为什么划分:为了兼容以前8位寄存器;

(AX寄存器模型)

AH和AL寄存器是可以独立使用的8位寄存器。

三、汇编指令

一个字可以存在一个16位的寄存器中,word = 2B;

add ax, bx :将AX,BX中的内容相加,结果放到AX中;

物理地址:CPU访问内存时要给出内存单元的地址,内存是一维、线性的连续空间;

四、16位的CPU怎么理解?

  1. 运算器(ALU)一次最多可以处理16位的数据;
  2. 寄存器的最大宽度为16位;
  3. 寄存器和运算器之间的通路是16位的;

五、地址加法器

8086有20位的地址总线,可传送20位地址,寻址能力1M;但是内部为16位的结构,表现寻址能力却只有64k。

原因:地址加法器合成物理地址的方法:物理地址 = 段地址*16+偏移地址(将2个16位的地址合成物理地址)

对段地址*16的理解:就是数据左移4位(对二进制);可以得到一个规律:一个数据的X进制左移1位,相当于乘以X。

六、段

本质:内存并没有分段,段的划分来自CPU,我们自己通过(段地址*16)+偏移地址来得到内存单元的物理地址,这才使得我们用分段的方式来管理内存。

  1. 一个段的起始地址一定是16的倍数;
  2. 一个段的最大长度为64K。

结论:CPU可以用不同的段地址和偏移地址来形成同一个物理地址。

七、段寄存器

  1. 、段寄存器就是提供段地址的。
  2. 、8086CPU有4个段寄存器:CS、DS、SS、ES;当8086要访问内存时,由这4个段寄存器提供内存单元的段地址。
    • CS:代码段寄存器;
    • DS:数据段寄存器;
    • SS:堆栈段寄存器;
    • ES:附加段寄存器;

八、CS和IP

  1. CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
  2. CS:代码段寄存器;IP:指令指针寄存器(偏移地址的寄存器); 此时,8086PC工作过程简要:
    • 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
    • IP = IP + 所读取指令的长度,从而指向下一条指令;(任务:索引到下一条指令)
    • 读取指令,一次这样执行工作;
  3. 8086PC工作过程:在8086CPU加电启动或复位后(就是CPU刚开始工作时,)CS=FFFFH, IP=0000H。即刚启动时,CPU从内存FFFF0H单元读取指令执行;FFFF0H单元中的指令是8086开机执行的第一条指令。
  4. 任何时候,CPU将CS、IP中的内容都当做指令的段地址和偏移地址,用他们来合成指令的物理地址,到内存中读取指令码执行。可以这么理解:内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。
  5. 可以修改CS:IP中的值来控制CPU的执行目标指令的地址。用jmp来修改段地址和偏移地址;如:jmp 2AE3:3

九、代码段

存放代码的地方,CPU不认识代码段,怎么执行这里的代码呢?

CPU只认被CS:IP指向的内存单元中的内容为指令;8086机器上,任意时刻,CPU将CS:IP指向的内容当作指令执行;

十、Debug汇编调试器

在winxp系统上,cmd-->debug进入即可(不区分大小写的)。

常用命令:

  • R:查看、改变CPU寄存器的内容;
  • D:查看内存中的内容;
  • E:改写内存中的内容;
  • U:将内存中的机器指令翻译成汇编指令;
  • T:执行一条机器指令;
  • A:以汇编指令的格式在内存中写入一条机器指令。

截图:

debug中的命令还得多加练习,熟悉即可!!!

十一、说明

原创文章链接:学习底层知识需要懂一些硬件和汇编的基础!