王爽老师《汇编语言》第二章——寄存器 笔记

时间:2020-12-07 01:23:43

 本文摘自http://blog.csdn.net/lr2131/article/details/6247159,非常感谢博主:从头再来 的知识分享!(自己做了部分修改)

                                                             第二章   寄存器

一、   通用寄存器

1.        8086CPU的所有寄存器都是16位的,可以存放两个字节。AXBXCXDX4个寄存器通常用来存放一般性的数据,被称为通用寄存器

2.        为保证和8086之前的8CPU兼容,8086CPUAXBXCXDX4个寄存器都可分为两个可独立使用的8位寄存器来用(AHALBHBLCHCLDHDL)  

王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记                          王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

二、   字在寄存器中的存储

1.        一个字是16位,可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。


三、   几条汇编指令

1.        在写一个汇编指令或一个寄存器的名称时不区分大小写

2.        8位寄存器(XHXL)操作时,CPU会把XHXL作为独立的8位寄存器来使用,如果XL寄存器运算溢出时不会将进位写到XH中,而当在对16位寄存器操作时,低8位数据的进位是会写到高8位数据中的。

王爽老师《汇编语言》第二章——寄存器 笔记

3.        注意指令的两个操作对象的位数应当是一致的。

举例:

                        王爽老师《汇编语言》第二章——寄存器 笔记          王爽老师《汇编语言》第二章——寄存器 笔记

以上这几条汇编指令都是错误的。


四、  物理地址

1.        所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址

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

 

五、   8086CPU给出物理地址的方法

1.        8086CPU20位的地址总线,可以传送20位地址,达到1MB寻址能力。

2.        8086CPU16位结构,在内部一次性处理、传输、暂时存储的地址为16位。

3.        8086CPU通过将216位地址合成的方法来形成一个20位的物理地址:

        物理地址 =段地址 x 16 + 偏移地址  (因为16即2的4次方,将某数左移4位,即该项数乘以2的4次方)

基地址 =段地址 x 16

    王爽老师《汇编语言》第二章——寄存器 笔记

六、   段的概念

1.  “段地址”包含着段的概念,但内存并不是被划分成一个一个的段,内存并没有分段,断的划分来自CPU,由于8086CPU用基础地址(段地址x16+偏移地址 = 物理地址的方式给出内存单元的物理地址,使得我们可以用分段的方式管理内存。

2.        在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

3.        段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数,偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB

4.       CPU可以用不同的段地址和偏移地址形成同一个物理地址。

               王爽老师《汇编语言》第二章——寄存器 笔记                王爽老师《汇编语言》第二章——寄存器 笔记

5.     由于一个物理地址可以映射多个段地址和偏移地址的组合,所以不应该只给出物理地址,准确的写法是段地址:偏移地址


七、 段寄存器

段地址是CPU中的谁提供的呢?

由CPU中的段寄存器提供。

8086CPU有4个段寄存器:CSDSES、SS


1.        8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。

2.        8086CPU在访问内存时,由CSDSSSES4个段寄存器提供内存单元的段地址。


八、 CSIP

1.        CSIP8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址,即CS:IP

         CS中存放段地址,IP中存放偏移地址

2.        CS为代码段寄存器,IP为指令指针寄存器,在任意时刻,CPU将从CSIP指向的内容开始,读取一条指令并执行。

           王爽老师《汇编语言》第二章——寄存器 笔记         王爽老师《汇编语言》第二章——寄存器 笔记

       王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

注意上图中的IP值的变化。

结合以上几幅图,得到下面的结论:

      8086CPU的工作过程简要的描述为:

           (1) 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

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

        (3)执行指令,转到步骤(1),反复这个过程。(注意(2)和(3)的顺序)

3.  8086CPU上电启动或复位后,CS=FFFFHIP=0000H,也即是FFFF0H单元中的指令是8086PC机开机执行的第一条指令。

 

九、     修改CSIP的指令

1.        CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内部实现对CPU的控制。

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

3.        8086CPU大部分寄存器的值,都可以用mov指令来改变,但mov指令不能用于设置CSIP的值,能够改变CSIP的内容的指令被统称为转移指令

4.        最简单的转移指令是jmp形式:jmp段地址:偏移地址

5.        若想仅修改IP的内容,可用“jmp某一合法寄存器”的指令完成。类似于mov IPax。(并不是真正拥有mov IP,ax 这条指令.)

   王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

 

十、     代码段

1.        在编程时,可以根据需要,将一组内存单元定义为一个段,我们可以将长度为NN<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。

2.        要让CPU执行我们编写的代码,就必须要让CS:IP指向我们的代码,CPU只会认为CS:IP指向的内存单元中的内容为指令,且是要执行的代码。


十一、   实验1查看CPU和内存,用机器指令和汇编指令编程

1.        DebugDOSWindows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。

2.        Debug的功能:

1)       R:查看、改变寄存器的内容

 

2)       D:查看内存中的内容

3)       E:改写内存中的内容

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

5)       T:执行一条机器指令

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

7)    Q:退出Debug


3.        Debug是在DOS方式下使用的程序,在进入Debug前,应先进入到DOS方式。

4.        Debug命令的典型使用范例:

1)       –r  查看CPU中各寄存器的值

 王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

2)       –r ax 在显示了ax中值后提示用户输入要修改的新值

 王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

3)       –d 列出debug预设的地址处的内容

 王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

4)       –d 1000:9列出10009H处的连续128字节的内存中的内容(即一直到10088)

王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

 王爽老师《汇编语言》第二章——寄存器 笔记

5)       –”e 起始地址 数据  数据   ……“的格式进行逐个修改内存中的内容

如:e 1000:0 0 1 2 3a+b 4 5 6 7 8 9 c’一次性逐个修改内存

 王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记

王爽老师《汇编语言》第二章——寄存器 笔记

6)       u 1000:10 查看汇编指令(即查看写入的或内存中原有的机器码所对应的汇编指令)

 王爽老师《汇编语言》第二章——寄存器 笔记王爽老师《汇编语言》第二章——寄存器 笔记