【汇编学习】汇编语言读书笔记(第二章)

汇编学习:寄存器(CPU工作原理)

寄存器

  • 内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系,简单来说,在CPU中:
    • 运算器进行信息处理
    • 寄存器进行信息存储
    • 控制器控制各种器件进行工作
    • 内部总线连接各种器件,在它们之间进行数据的传送
  • CPU中的主要器件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制
  • 8086CPU有14个寄存器,每个寄存器都有一个名称。这些寄存器是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

通用寄存器

  • 8086CPU 的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
    • 一个16位寄存器可以存储的数据的最大值为2^16。
    • 8086CPU的AX、BX、CX、DX这4个寄存器都可以分为两个可独立使用的8位寄存器来使用:
    • AX可分为AH和AL;
    • BX可分为BH和BL;
    • CX可分为CH和CL;
    • DX可分为DH和DL;

字在寄存器中的存储

  • 8086CPU可以一次性处理一下两种尺寸的数据:
    • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
    • 字:记为word,一个字由两个字节组成,分为高位字节和低位字节。

几条汇编指令

  • 在写一条汇编指令或一个寄存器的名称时不区分大小写
  • 在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的

物理地址

  • CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。

16位结构的CPU

  • 16位结构描述了一个CPU具有下面几个方面的结构特性:
    • 运算器一次最多可以处理16位的数据;
    • 寄存器的最大宽度为16位;
    • 寄存器和运算器之间的通路位16位;

8086CPU给出物理地址的方法

  • 8086CPU由20位地址总线,可以传送20位地址,达到1MB寻址能力
  • 8086CPU要读写内存时:
    • CPU中相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址;
    • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
    • 地址加法器将两个16位地址合成为一个20位的物理地址;
    • 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
    • 输入输出控制电路将20位物理地址送上地址总线;
    • 20位物理地址被地址总线传送到存储器。
  • 地址加法器采用物理地址=段地址*16+偏移地址的方法和用段地址和偏移地址合成物理地址

段的概念

  • 在编程时可以根据需要,将若干地址连续的内存单元看做一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
  • CPU访问内存单元时,必须向内存提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
  • CPU可以用不同的段地址和偏移地址形成同一个物理地址
  • 偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。

段寄存器

  • 8086CPU有四个段寄存器:CS、DS、SS、ES

CS和IP

  • CS为代码寄存器,IP为指令指针寄存器
  • 8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行
  • 在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令时8086PC机开机后执行的第一条指令
  • CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

修改CS、IP的指令

  • 8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称为传送指令。
  • 能够改变CS、IP的内容的指令被称作转移指令

代码段

  • 将一段内存当做代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当作指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。
  • 要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。

小结

  • 8086CPU的工作过程:
    • 从CS:IP指向的内存内存单元读取指令,读取的指令进入指令缓冲器
    • IP指向下一条指令;
    • 执行指令

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

  • Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具
  • 用到的Dubug的功能
    • r命令查看、改变CPU寄存器的内容;
    • d命令查看内存中的内容
    • e命令改写内存中的内容
    • u命令将内存中的机器指令翻译成汇编指令;
    • t命令执行一条机器指令
    • a命令以汇编指令的格式在内存中写入一条机器指令
  • 查看在内存FFF00H~FFFFFH的某几个内存单元并尝试改写,并不能成功

    通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为’/’的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性.

  • 向内存从B8100H开始的单元中填写数据,观察现象

    B8100H开始的内存空间是显存空间,通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围>

习题检测2.1

  • 写出每条汇编指令执行之后相关寄存器中的值

    mov ax,62627            AX=F4A3H
    mov ah,31H              AX=31A3H
    mov al,23H              AX=3123H
    add ax,ax               AX=6246H
    mov bx,826CH            BX=826CH
    mov cx,ax               CX=6246H
    mov ax,bx               AX=826CH
    add ax,bx               AX=04D8H
    mov al,bh               AX=0482H
    mov ah,bl               AX=6C82H
    add ah,ah               AX=D882H
    add al,6                AX=D888H
    add al,al               AX=D810H
    mov ax,cx               AX=6246H
    
  • 编程计算2的4次方

    mov ax,2
    mov ax,ax
    mov ax,ax
    mov ax,ax

习题检测2.2

  • 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为(00010H)到(1000FH)。
  • 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为(1001H),最大为(2000H)

习题检测2.3

  • 下面的3条指令执行之后,CPU几次修改IP,都是在什么时候,最后IP中的值是多少?

    mov ax,bx
    sub ax,ax
    jmp ax

  • 一共变化四次

    • 执行完mov ax,bx后
    • 执行完sub ax,ax后
    • 读入jmp ax后
    • 执行jmp ax后IP的值应当为0000H

你可能感兴趣的:(汇编学习)