各类相关名词
CPU:一种可以执行机器指令进行运算的芯片(微处理器)。
存储器(内存):存放CPU可以工作的指令和数据(指令和数据都是二进制信息)。 磁盘不同于内存,磁盘中的数据要读到内存中才能被CPU使用
磁盘>>内存>>CPU
存储器分若干存储单元,并从0开始按顺序编号(一个存储器有128个存储单元,编号0~128)
电子计算机最小信息单位是bit(比特),即一个二进制位。
8个bit(8个二进制位)组成一个字节(Byte)。
大容量存储器计量容量的单位(磁盘单位也一样):
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
机器指令就是一台机器可以正确执行的命令。(电子计算机的机器指令是一列二进制数字0、1)
主板:上面有核心器件和主要器件,还有拓展插槽(上面一般有RAM内存条和各类接口卡)他们通过总线相连
接口卡:CPU对外部设备(显示器、音响、打印机等)不能直接控制,插在扩展插槽上的接口卡才能直接控制,CPU又可以通过总线直接控制接口卡,达到根据CPU间接命令控制外设进行工作的目的 (很长一大段总结下来的)
二进制数字>>高低电平>>驱动计算机电子器件>>进行运算
寄存器:CPU中可以存储数据的器件,一个CPU含有多个寄存器
汇编指令是机器指令便于记忆的书写格式。(用于编写源程序)
操作:寄存器BX的内容送到AX中(其中一个寄存器的代号,即另一个寄存器)
机器指令:1000100111011000
汇编指令: mov ax,bx
(汇编语言写出)源程序 >> 汇编编译器(编译为) >> 机器码(计算机可执行)
CPU对存储的读写
因为存储器被划分成多个存储单元并编号,可将编号视为地址,方便CPU从指定地址中读取数据
CPU要想进行数据的读写,必须和芯片进行3类信息交互:
(1)存储单元的地址(地址信息)
(2)器件的选择,读或写的命令
(3)读或写的数据(数据选择)
如图
我将其通俗的理解为 1找、2回、3去
专门连接CPU和其他芯片的导线:总线(逻辑上分为 地址总线、控制总线、数据总线)
即 “”一找地址线、二回数据线、三去控制线”,这样感觉方便理解一点
写、读操作的步骤都一样。
地址总线
一根导线只能传送 高电平 或 低电平 两种稳定状态,二进制表示 0 或 1.
10根导线可传送10位二进制数据;10位二进制数据可表示2**10(2的10次方)个不同的数据(最小0,最大1023)
地址总线的宽度决定了CPU的寻址能力
如10根地址线的CPU向内存发出地址信息11时 10根地址线上传送的二进制信息为:
数据总线
数据总线:CPU与内存或其他器件之间进行数据传输的介质,其宽度(根数)决定CPU与外界的数据传输速度。
如8根数据总线一次可传送一个8位2二进制数(即一字节)
8088CPU(总线宽为8)的数据传输情况为:
8086CPU(总线宽16)的数据传输情况:
控制总线
CPU可通过控制总线(是一些不同控制线的集合)对外部器件进行控制。有多少根控制总线就意味着CPU对外部的控制有多少种。(越多控制能力越强,包括读或写命令)
总之,
汇编指令是机器指令的助记符,他们一 一对应。
每一种CPU都有自己的汇编指令集
CPU可以直接使用的信息存放在存储器中
存储器中指令和数据没有任何区别(都是二进制信息)
最终运行程序的是CPU,用汇编语言编程的时候,必须要从CPU的角度考虑问题。
对于CPU来讲,系统中所有 存储器 中的 存储单元 都处于一个统一的 逻辑存储器 中,它的容量受CPU 寻址能力 的限制(这句话或许要在后期的学习中逐渐体会)
典型的CPU是由寄存器(核心)、运算器、控制器等器件组成。
寄存器:信息存储。程序员可以用指令读写,并通过改变寄存器中的内容来实现对CPU的控制。其最大宽度为16位
运算器:信息处理。一次最多可处理16位的数据 (寄存器和运算器之间的通路为16位 )
控制器:控制器件工作
内部总线:实现CPU内各器件间联系,进行数据传输。
十六进制数的一位相当于二进制数的四位,如二进制数0100111000100000表示为
4(0100)、E(1110)、2(0010)、0(0000)四位十六进制数
十六进制数后加H、二进制数据后加B、十进制数后啥也不加
如 十进制数20000 十六进制:4E20H 二进制:0100111000100000B
8086CPU所有寄存器都是16位(可存放两个字节),
通用寄存器:AX、BX、CX、DX(ABCD埃克斯(X))存放一般数据
8086CPU上一代寄存器为8位,其稍加修改就可运行在8086之上,即ABCD埃克斯(X)四个寄存器每个都可分为两个独立使用的8位寄存器来用(二8 16嘛)
ABCD埃克斯(X)下分的两个寄存器就是H和L(即AX>>AH、AL;BX>>BH、BL.......)
简单粗暴但好记。
8086CPU要读写内存时:
(1)CPU中的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址。
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件。
(3)地址加法器将两个16位地址合成为一个20位的物理地址。
(4)地址加法器通过内部总线将20位物理地址送入 输入输出控制电路。
(5)输入输出控制电路将20位物理地址送上 地址总线。
(6)20位物理地址被地址总线传送到 存储器。
段地址+偏移地址>>地址加法器 (合成)>>物理地址 >>输入输出控制电路>>地址总线>>存储器
地址加法器采用 物理地址=段地址X16+偏移地址 的方法用段地址和偏移地址合成物理地址
如图为地址加法器的工作过程:
这里“段地址X16”有一个更常用的说法就是 “左移4位”
因为计算机中所有信息都以二进制形式存储,段地址也不例外。机器只能处理二进制信息,左移4位的 位 指二进制位。如这里的一个例子:
一个数据为2H,二进制形式为10B,对其进行左移运算:
总结出规律:
(1)一个数据二进制形式左移1位,相当于该数据乘以2;
(2)左移N位,相当于该数据乘以2**N(2的N次方)
(3)地址加法器就是将 以二进制形式存放的段地址左移4位 来完成段地址X16的运算。
哎呀其实这里“段地址X16+偏移地址=物理地址”的本质含义就是CPU在访问内存时,用一个基础地址(段地址X16)和一个偏移地址(是相对于基础地址的,可以不用管)相加,来给出内存单元的物理地址。
即8086CPU的这种寻址功能为 “基础地址+偏移地址=物理地址” 方案。
举个例子就是
一个路人向我问路,说食堂地址是多少
我可以告诉他从图书馆到食堂2000m(物理地址);
我也可以告诉他从图书馆到田径场1500m(相对起点的基础地址),然后从田径场到食堂500m(相对于基础地址并以基础地址为起点的偏移地址)
段:编程的时候,根据需要将若干地址连续的内存单元看做一个段,然后用段地址X16定位段的 起始地址,用偏移地址定位段中的内存单元
段寄存器:CS、DS、SS、ES是8086CPU中的四个段寄存器。其中存放段地址。
CS、IP是8086CPU中两个最关键的寄存器,他们指示了CPU当前要读取指令的地址。
CS:代码段寄存器
IP:指令指针寄存器
通俗的讲,就是CPU将从内存CS X 16 + IP 单元开始,读取一条指令并执行(其中CS、IP代表他们的值)
《汇编语言》中的图比较多,而8086CPU的工作过程可以简要描述为:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入缓冲器
(2)IP=IP+所读取指令的长度,(就是在输入输出电路将机器指令送入指令缓冲器后读取了一条指令,随即IP的值自动增加以使CPU可以读取下一条指令)从而指向下一条指令
如图
(3)执行指令。
随即转到步骤(1)并重复这一过程。
汇编语言的组成
(1)汇编指令(核心,其决定了汇编语言的特性):机器码的助记符,有对应的机器码
(2)伪指令:没有对应的机器码,由编译器执行,计算机不执行
(3)其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码
为方便理解,有时会用文字描述和高级语言描述两种方式来描述一条汇编指令的含义。
在写汇编指令或寄存器名称时不区分大小写,如 mov ax,18和 MOV AX,18 含义相同。
注意 add ax, bx 表示将寄存器ax中的数值加上寄存器bx中的数值,但bx中的数值不改变。
在进行数据传输或运算时,要注意指令的两个操作对象的位数(8位、16位)应当是一致的,如
mov ax,bl(在8位和16位寄存器间传送数据)
mov bh,ax(在16位和8位寄存器间传送数据)
mov al,20000(8位寄存器最大可存放值为255的数据)
add al,100H(将一个高于8位的数据加到一个8位寄存器中)
等都是错误指令(指令得到两个操作对象位数不一致)
修改CS、IP的指令
程序员 >> 可改变CS、IP内容 >> 控制CPU >>执行目标指令
上面的例子 mov ax,bx 中,如 mov ax,123 意为将ax的值设为123,而8086CPU大部分寄存器的值,都可以用mov 指令改变,但是,mov 指令不能用于设置CS、IP的值(因为8086CPU没有提供这样的功能)
可以这样修改寄存器CS、IP中的内容
其中一个指令为 jmp 指令
例如,想同时修改CS、IP的内容,可用 “jmp 段地址:偏移地址” 的指令完成
eg.
jmp 2AE3:3 执行后:CS=2AE3H,IP=0003H (H代表16进制,之前说过),CPU将从2AE33H处读取指令。
反过来也一样的
jmp 3:0B16 执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令(别忘了CS X 16 + IP ,所以是00B46H)
“jmp 段地址:偏移地址” 的指令功能为:用指令中给出的段地址修改CS,偏移地址修改IP。(虽然终究是修改,但却是一 一对应)的
若仅修改IP的内容,可以用“jmp 某一合法寄存器”(该指令的作用为:用该寄存器的值修改IP,相当于 mov IP,ax,但mov IP,ax是不可用的)
如
ax=1000H,CS=2000H,IP=0003H
jmp ax,之后
ax=1000H,CS=2000H,IP=1000H
代码段
这个就通俗的理解为一段有几个字节的指令,存放在某一组内存单元中,则这段内存是用来存放代码的,这就是一段代码段。