汇编语言_第2章 寄存器

第2章 寄存器

一个典型的CPU 由运算器、控制器、寄存器 等器件构成,这些器件靠内部总线相连。在CPU中:

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器控制各种期间进行工作;
  • 内部总线连接各种器件,在它们之间进行数据的传送;

2.1 通用寄存器

  • 通用寄存器:通常用来存放一般性的数据的寄存器。如8086CPU 中AX、BX、CX、DX 这4个寄存器【8086CPU中所有的寄存器都是16位的。】

    8086CPU 中AX、BX、CX、DX 都可分为2个独立使用的8位寄存器来用:

  • AX: AH和AL;

  • BX: BH和BL;

  • CX: CH和CL;

  • DX: DH和DL;
    在这里插入图片描述

2.2 字在寄存器中的存储

  • 字节:byte,一个字节由8个bit组成。
  • 字: word,一个字由2个字节组成,这2个字节分别称为高位字节和低位字节
    在这里插入图片描述

2.3 几条汇编指令
在这里插入图片描述
注:

  • 在写一个汇编指令或一个寄存器名称时不区分大小写。
  • 16位的寄存器,当要写入的数据超过16位时,最高位的数据无法写入,仅能写入低16位数据。
  • 在进行数据传送和运算时,要注意指令的2个操作对象的位数应一致。
    例:mov ax,bl (ax 为16位,bl 为8位 此指令是错误的)

2.4 物理地址
所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有一个唯一的地址,即物理地址。

2.5 16位结构的CPU
16位结构(16位机、字长为16 位):

  • 运算器一次最多可以处理16位的数据;
  • 寄存器的最大宽度为16位;
  • 寄存器和运算器之间的通路为16位;

2.6 8086CPU给出物理地址的方法
8086CPU 有20位地址总线,即1MB寻址能力。8086CPU 又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。表现出的寻址能力只有64KB.
在这里插入图片描述

  • 地址加法器 采用 物理地址= 段地址x16 + 偏移地址 的方法合成物理地址。
  • 例:8086CPU要访问地址为123C8的内存单元
    在这里插入图片描述

“段地址x16” 更为常用的说法是左移4位。一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。 即 一个数据的16进制形式左移1位,相当于x16;X进制的数据左移1位,相当于乘以X。

2.7 物理地址= 段地址x16 + 偏移地址 的本质含义

  • “物理地址= 段地址x16 + 偏移地址”
    的本质含义:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。即
    “基础地址+偏移地址=物理地址”

2.8 段的概念
其实,内存并没有分段,段的划分来自于CPU,由于8086CPU 用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存.
在这里插入图片描述
注意:

  • 段地址x16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
  • 偏移地址为16位,16位地址的寻址能力为64KB,所以一个短的长度最大为64KB.
  • 在8086 PC 中,数据在21F60H 内存单元中,表示为:
    ①数据存在内存 2000:1F60 单元中;
    ②数据存在内存的2000段中的1F60单元中;

2.9 段寄存器
段地址在8086CPU的段寄存器中存放。8086CPU 有4个段寄存器:CS、DS、SS、ES.

2.10 CS 和 IP
**CS : 代码段寄存器;IP : 指令指针寄存器;**它们指示了CPU 当前要读取指令的地址。
在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086 CPU将从内存 Mx16+N 单元开始,读取一条指令并执行。即: CPU将 CS:IP 指向的内容当做指令执行。
- 8086CPU 读取、执行一条指令的过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

- 8086CPU 工作过程:
①从CS:IP 指向的内存单元读取指令,读取的指令进入指令缓冲器;
②IP=IP+所读指令长度,从而指向吓一条指令;
③执行指令。转到步骤①重复这个过程;

CPU根据什么将内存中的信息看作指令?
CPU将CS:IP 指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP 中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

2.11 修改CS、IP 的指令

程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS、IP 中的内容决定的,可以通过修改CS、IP 的内容来控制CPU执行目标指令。

  • mov 指令:传送指令; mov ax,123 注:mov指令不能用于设置CS、IP的值。
  • jmp指令:转移指令;
    同时修改CS、IP的内容: jmp 段地址:偏移地址 (用指令中给出的段地址修改CS,偏移地址修改IP)
    例:jmp 2AE3:3
    仅修改IP 内容, jmp 某一合法寄存器 (指令功能:用寄存器中的值修改IP)
    例:jmp ax

2.12 代码段

例:
mov ax,0000 (B8 00 00)
add ax,0123 (05 23 01)
mov bx,ax (8B D8)
jmp bx (FF E3)
这段长度为10 个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就认为123B0H ~ 123B9H 这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。
要让CPU执行我们放在代码段中的指令,必须要将CS:IP 指向所定义的代码段中的第一条指令的首地址。

预备知识:Debug的使用
①什么是Debug?
Debug 是DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看CPU 各种寄存器中的内容、内存的情况 和 在机器码级跟踪程序的运行。
②Debug 功能

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

③进入Debug 参考https://blog.csdn.net/madao1234/article/details/82951640
④ R 命令查看CPU中各个寄存器中的内容
在这里插入图片描述
用R命令改变寄存器中的内容:用R+寄存器名
在这里插入图片描述
⑤ D命令 查看内存内容
d 段地址:偏移地址 的格式查看
在这里插入图片描述
使用D命令,Debug将输出3部分内容:

  • 中间是从指定地址开始的128个内存单元的内容,16进制的格式输出;(注意在每行的中间有一个“-”,它将每行的输出分为2部分,便于查看)

  • 左边是每行的起始地址;

  • 右边是每个内存单元中的数据对应的可显示的ASCII码字符;没有对应可显示的ACSII码字符 用 . 代替

  • 在使用 d 段地址:偏移地址 之后,接着使用D命令,可列出后续的内容。

  • 指定D命令查看范围: d 段地址:起始偏移地址 结尾偏移地址 , d 1000:0 9 查看 1000:0 ~ 1000:9的内容。
    在这里插入图片描述

⑥E 命令 改写内存中的内容
在这里插入图片描述

可以用E命令逐个修改某一地址开始的内存单元的内容 :

  • e 1000:1
  • Debug 显示起始地址1000:1 和第一个单元的原始内容,然后光标停在“ . ”
    的后面提示输入想要写入的数据,输入数据改写当前内存单元 ,不输入直接按空格则不修改内存单元
  • 当前单元处理完成后 (按了空格键表示处理完成),Debug 将接着显示下一个内存单元的内容, 所有改写完成后,按Enter ,E命令操作结束。
    在这里插入图片描述

⑦ e命令写入机器码 ,U命令查看机器码含义,T命令执行内存中的机器码
在这里插入图片描述
在这里插入图片描述

⑧ A命令 以汇编指令的形式在内存中写入机器指令
在这里插入图片描述

To be continue…

猜你喜欢

转载自blog.csdn.net/madao1234/article/details/83210561