1. 寄存器、寄存器(内存)、实验一

216 阅读5分钟

1.1 通用寄存器

8086cpu所有寄存器都是两个字节,16位。其中AX, BX, CX, DX是用来存放一般数据的,被称为通用寄存器。同时为了与上一代及其兼容,每个寄存器可分为独立使用的两个8位寄存器来用:

  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

1.2 字在寄存器中的存储

出于兼容性的考虑,8086cpu可以一次性处理一下两种尺寸的数据。

  • 字节:记为byte,一个字节由8个bit组成。
  • 字:记为word,一个字由16个bit组成。

1.3 几条汇编指令

汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax, 18将18送入寄存器AXAX = 18
mov ah, 78将78送入寄存器AHAH = 78
add ax, 8将寄存器AX中的值加上8AX = AX + 8
mov ax, bx将寄存器BX中的值送入寄存器AXAX = BX
add ax, bx将AX和BX中的数值相加,存入AXAX = AX + BX

1.4 8086CPU给出物理地址的方法

8086是一个16位的CPU,那么16位的CPU的结构特性是什么呢?

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

当CPU在访问内存单元的时候,需要给出内存地址。8086CPU有20根地址线,可以传送20位的地址,达到1MB的寻址能力。而8086CPU是16位的结构,在内部一次性处理、传输、暂时存储的地址是16位。所以它采用了一种在内部用两个16位的地址来合成的方法来形成一个20位的地址。

物理地址 = 段地址X16 + 偏移地址 ,对于二进制的形式地址来说,乘16也就是左移4位。这种形式应该就是计算机组成原理中提到的 基础地址 + 偏移地址 = 物理地址的形式。

需要强调的是,段地址并不意味着内存真的被划分成一个一个的段。这种划分来自于CPU

1.5 段寄存器

8086CPU有四个段寄存器,CS、DS、SS、ES。暂时只看到CS段寄存器。

CS和IP是8086CPU中两个最重要的寄存器,它们指示了CPU当前要读取指令的地址。CS是代码段寄存器,IP是指令指针寄存器。在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M x 16 + N单元开始,读取一条指令并执行。

读取一条指令后,IP中的值会根据指令的字节数自动增加。

如何手动修改CS和IP寄存器中的值呢? 8086CPU不支持用mov指令去修改CS、IP中的值。可用形如 jmp 段地址:偏移地址的形式去修改。如果仅修改IP寄存器的内容,可用jmp 某一合法寄存器的指令完成。

实验一

  • R命令可以查看或者修改指定寄存器中的内容。如RAX,则修改AX寄存器中的内容。
  • D命令可以查看内存中的内容,如D 段地址:偏移地址,或者D 段地址:起始偏移地址 结尾偏移地址。
  • E命令可以编辑内存中的内容,机器码形式。
  • T命令可以执行CS:IP指向的单元的指令。
  • U命令可以查看内存中机器码对应的汇编指令。
  • A命令以汇编形式在内存中写入机器指令。

1.6 内存中字的存储和传送

在8086CPU中,一个字是16位,而内存单元是字节单元(一个单元存放一个字节),则一个字需要用两个地址连续的内存单元来存放。字的高位字节存放在高地址单元,低位字节存放在低地址单元

字单元的概念:字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。

CPU要读写一个内存单元,就要给出这个内存单元的地址,在8086CPU内存地址由段地址和偏移地址组成。DS寄存器,通常用来存放要访问的数据的段地址。

比如,我们要读取10000H单元的地址。示例如下:

 mov ax, 1000
 mov ds, ax
 mov al, [0]

注意:8086CPU可以用"mov ds, 通用寄存器"来修改数据段寄存器。

但只能用 jmp 指令修改CS和IP指令寄存器。

[address]表示一个偏移地址为address的内存单元。

当在内存和寄存器中传送字时,只需给出16位寄存器即可。

1.7 栈

8086CPU提供相关的指令以栈的方式来访问内存空间。最基本的包括PUSH和POP指令。如PUSH AX 表示将AX寄存器中的值送入栈, POP AX 表示将栈顶的值弹出并存入AX。需要注意的是,8086CPU的入栈和出栈操作都是以字为单位的

8086CPU中,有段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素

因为栈顶指针SP指向栈顶元素,则

入栈时,需要先移动栈顶指针SP,又因为入栈时栈顶从高地址向低地址方向增长,则形如push ax的过程如下:

  • SP = SP - 2
  • 将AX寄存器中的内容送入栈顶

出栈时,需要取出栈顶元素,再移动栈顶指针,则形如pop ax的过程如下:

  • 将栈顶元素送入AX
  • SP = SP + 2

注意:若将10000H~1000FH这段空间当作栈,切初始时栈为空。此时,SS = 1000H, SP = ?