汇编语言(王爽)-寄存器


一个典型的CPU由运算器,控制器,寄存器等组成

内部总线实现CPU内器件联系

外部总线实现CPU和主板上其他器件联系

CPU中:

  1. 运算器进行信息处理

  2. 寄存器进行信息存储

  3. 控制器控制各种器件进行工作

  4. 内部总线连接CPU内部器件,在它们之间进行数据传送

寄存器是CPU中程序员可用指令读写的部件

程序员可以通过改变各种寄存器中的内容来实现对CPU的控制

通用寄存器

8086CPU为16位寄存器,每个寄存器存放两个字节数据

通用寄存器,用于存放一般性数据,为:

  1. AX

  2. BX

  3. CX

  4. DX

8086CPU的通用寄存器中每个寄存器都可以分为两个可独立使用的8位寄存器使用

低8位为L,高8位为H

  1. AX -> AH + AL

  2. BX -> BH + BL

  3. CX -> CH + CL

  4. DX -> DH + DL

字在寄存器中的存储

  1. 字节:byte,1byte=8bit

  2. 字:word,1word=2byte=16bit。这两个字节称为这个字的高位字节和低位字节

1.png

几条汇编指令

汇编指令与寄存器名称不区分大小写

  1. mov ax,18 —> 将18送入寄存器AX

  2. add ax,8 —> 将AX中的值加8后存入AX

  3. mov ax,bx —> 将BX数据送入AX

  4. add ax,bx —> 将AX与BX中数据相加后存入AX

当使用AL之类的8位寄存器时,AHAL为两个不相关的寄存器,AL计算产生的进位不会存储到AH

当使用AL之类寄存器时,进行的是8位运算

当使用AX之类寄存器时,进行的是16位运算

当汇编指令的两个操作对象的位数不一致时,无法进行运算操作,此时的汇编指令为错误的

物理地址

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址

CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址

16位结构的CPU

16位结构(16位机,字长为16位)的CPU具有以下特性:

  1. 运算器一次最多可以处理16位的数据

  2. 寄存器的最大宽度为16位

  3. 寄存器与运算器之间的通路位16位

对于16位的CPU,能一次处理,传输,暂时存储16位的地址

8086CPU给出物理地址的方法

8086CPU有20条地址总线,可达到1MB的寻址能力

但8086CPU为16位结构,其内部只能处理,传输,暂时存储16位的地址,所以其表现出的寻址能力只有64KB

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址

2.png

如图

  1. CPU提供两个16位地址,一个称为段地址SA,另一个位偏移地址EA

  2. 两个16位地址通过内部总线送入地址加法器

  3. 地址加法器将两个16位地址合成为一个20位的物理地址

  4. 地址加法器通过内部总线将20位的物理地址送入输入输出控制电路

  5. 输入输出控制电路将20位物理地址送入地址总线

  6. 20位物理地址被地址总线传送到存储器

地址加法器采用物理地址=段地址*16+偏移地址
的方法合成物理地址

*16对于十六进制来说为多加一个0,左移1位;对于二进制来说为多加四个0,左移4位

“段地址*16+偏移地址=物理地址”的本质含义

CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址

基础地址(段地址*16)+偏移地址=物理地址

段的概念

内存并没有分段,段的划分来自于CPU

CPU用分段的方法来管理内存

若编程需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始位置(基础地址),用偏移地址定位段中的内存单元

注意:

  1. 段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数

  2. 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB

段寄存器

段地址在8086CPU的段寄存器中存放

8086CPU有4个段寄存器:CS,DS,SS,ES

CS和IP

它们指示了CPU当前要读取指令的地址

CS为代码段寄存器,存放指令的段地址

IP为指令指针寄存器,存放指令的偏移地址

在8086CPU中,任意时刻,设CS中内容为MIP中内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行

即,8086机中,任意时刻,CPUCS:IP指向的内容当作指令执行

3.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

11.png

12.png

13.png

14.png

15.png

16.png

17.png

18.png

19.png

8086CPU工作过程如下:

  1. CS:IP指向的内存单元读取指令,读取的指令进入指令缓存器

  2. IP=IP+所读取指令的长度,从而指向下一条指令

  3. 执行指令。转到步骤1,重复这个过程

CPU初始时,CS=FFFFH,IP=0000H。即,8086PC机开机后执行的第一条指令是FFFF0H内存单元中的指令

修改CS,IP的指令

CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令

mov指令称为传送指令,但其不可以设置CS,IP的值

能够改变CS,IP的内容的指令被统称为转移指令

jmp指令为转移指令的一种

  1. 同时修改CS,IP的内容

    格式:jmp 段地址:偏移地址

    例:jmp 2AE3:3,执行后:CS=2AE3H,IP=0003HCPU将从2AE33H处读取指令

  2. 修改IP的内容

    格式:jmp 某一合法寄存器

    功能:用寄存器中的值修改IP

    例:jmp ax,

    指令执行前:ax=1000H,CS=2000H,IP=0003H

    指令执行后:ax=1000H,CS=2000H,IP=1000H

代码段

对于8086PC机,可根据需要,将一组内存单元定义为一个段。

可以将长度为N(N<=64KB)的一组代码,存放在一组地址连续,起始地址为16的倍数的内存单元中。此时,这段内存是用来存放代码的,从而定义了一个代码段

要让CPU执行代码段中的指令,必须将CS:IP指向所定义的代码段中的第一条指令的首地址


Debug

安装使用

win10 64位使用debug方法:

https://blog.csdn.net/plus_re/article/details/60761467

Debug常用功能

  1. R命令查看,改变CPU寄存器的内容

  2. D命令查看内存中的内容

  3. E命令改写内存中的内容

  4. U命令将内存中的机器指令翻译成汇编指令

  5. T命令执行一条机器指令

  6. A命令以汇编指令的格式在内存中写入一条机器指令

Debug操作

  1. R命令查看,改变CPU寄存器的内容

    1. 查看寄存器内容

      20.png

      如图:CS:IP所指向的内存单元为073F:0100,此处的指令即CPU当前要读取,执行的指令,此处存放的机器码为0000,对应的汇编指令为ADD [BX+SI],AL

    2. 修改寄存器内容

      21.png

  2. D命令查看内存中的内容

    1. 格式:d 段地址:偏移地址

      22.png

      如图,此时将列出从指定内存单元开始的128个内存单元中的内容

    2. 格式:d 段地址:起始偏移地址 结尾偏移地址

      23.png

      如图,指定D命令的查看范围

    3. 格式:d

      27.png

      会一直回显后面内存单元中的内容

  3. E命令改写内存中的内容

    格式:e 起始地址(段地址:偏移地址) 数据 数据 数据 ...

    24.png

    可以使用E命令向内存中写入数字,字符(‘ ‘),字符串(“ “),机器码

  4. U命令将内存中的机器指令翻译成汇编指令

    格式:u 起始地址(段地址:偏移地址)

    25.png

    将从开始内存单元中将内容翻译成汇编指令,并显示出来

  5. T命令执行机器指令

    格式:t

    26.png

    执行CS:IP指向的指令,指令执行后,显示输出CPU中的寄存器状态

  6. A命令以汇编指令的格式在内存中写入一条机器指令

    格式:a 段地址:偏移地址

    29.png

---------------The End---------------
0%