汇编学习《汇编语言(第三版)》王爽著第二章学习

  • Post author:
  • Post category:其他




第二章寄存器

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。外部总线实现CPU和主板上其他器件的联系。

  • 运算器进行信息处理

  • 寄存器进行信息存储

  • 控制器控制各种器件进行工作

  • 内部总线连接各种器件,在他们之间进行数据的传送

    不同CPU寄存器个数、结构不同。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW



2.1通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节。

AX、BX、CX、DX这4个寄存器都可分为两个独立可用的8位寄存器

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

如tuyi



2.2字在寄存器中的储存

  • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中

  • 字:记为word,一个字由两个字节组成,这两个字节分别称为这两个字的高位字节和低位字节,

    字:

    01001110

    |

    00100000

    ​ 高位字节 低位字节


    十六进制表示的数据后面加H,在二进制表示的数据后面加B,十进制后什么都不加



2.3几条汇编指令

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

程序段中指令的执行情况

程序段中的指令 指令执行后AX中的数据 指令执行后BX中的数据
mov ax,001AH 001AH 0000H
mov bx,0026H 001AH 0026H
add al,bl 0040H 0026H
add ah,bl 2640H 0026H
add bh,al 2640H 4026H
mov ah,0 0040H 4026H
add al,85H 00C5H 4026H
add al,93H 0058H 4026H

例,使用汇编指令编程计算2的4次方

使用下面3条指令写如2000:0开始的内存单元

mov ax,1
add ax,ax
jmp 2000:0003



2.4物理地址

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

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址。



2.5 16位结构的CPU

我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说是8086是16位结构的CPU。

对于16位结构CPU的解释:

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

  • 寄存器的最大宽度为16位;

  • 寄存器和运算器之间的通路为16位。



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

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地出发,那么它只能送出16位的地址,表现出的寻址能力只有64KB。

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

8086CPU相关部件的逻辑结构如图所示

在这里插入图片描述

  • CPU中的相关部件提供两个16位的地址,一个称为段地址另一个称为偏移地址;
  • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  • 地址加法器将两个16位地址合成为一个20位的物理地址;
  • 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
  • 输入输出控制电路将20位物理地址送上地址总线;
  • 20位物理地址被地址总线传送到存储器。

在这里插入图片描述



2.7 段的概念

地址10000H~100FFH的内存单元组成一个段,

该段的起始地址为1000H,段地址为1000H,大小为100H;

我们也可以认为地址10000H~ 1007FH、10080H~100FFH的内存单元组成两个段,他们的起始地址为:10000H和1080H,段地址为1000H和1008H,大小都为80H

在这里插入图片描述



2.8 CS和IP

CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP位指令指针寄存器,从名称上我们可以看出它们和指令的关系。

在8060PC机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

下图为8086CPU读取、执行指令的工作原理

在这里插入图片描述

  1. 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;
  2. 内存20000H~20009H单元存放这可执行的机器码;
  3. 内存20000H~20009H单元中存放的机器码对应的汇编指令如下
地址 内容 长度 对应汇编指令
20000H~20002H B82301 3Byte mov ax,0123H
20003H~20005H BB0300 3Byte mov bx,0003H
20006H~20007H 89D8 2Byte mov ax,bx
20008H~20009H 01D8 2Byte add ax,bx

8086CPU的工作过程可以简要描述如下

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP=IP+所读指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤(1),重复这个过程



2.9修改CS、IP的值

程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

mov指令可以修改AX中的值如 mov ax,123 将AX中值设为123,CPU大部分寄存器的值都可以用mov指令来改变,mov指令被称为传送指令

但是mov指令不能用于设置CS、IP的值,这里引用jmp指令


jmp 2AM3:3,执行后CS=2AE3H,IP=003H,CPU将从 2AE33H 处读取指令


jmp 3:0B16,执行后CS=0003H,CPU将从 00B46H 处读取指令

“ jmp 段地址:偏移地址 ”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP

若向仅修改IP的内容,可用形如“jmp 莫一合法寄存器”的指令完成

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

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

jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H

​ 指令执行后:bx=0B16H,CS=2000H,IP=0B16H

“jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP

在这里插入图片描述

指令执行序列:

  1. mov ax,6622H
  2. jmp 1000:3
  3. mov ax,0000
  4. mov bx,ax
  5. jmp bx
  6. mov ax,0123H
  7. 转到第三步



2.10代码段

我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中

mov ax,0000   (B8 00 00)
add ax,0123H  (05 23 01)
mov bx,ax     (8B D8)
jmp bx        (FF E3)

这段长度为10个字节的指令,存放在123B0H~123B9H 的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个大妈段,他的段地址为123BH,长度为10个字节



2.11 Debug的使用

  1. 什么是debug

    debug是DOS、windows都提供的实模式程序的调试工具。使用它可以查看CPU各种寄存器中的内容,内存的情况在机器码级跟踪程序的运行

  2. 我们用到的Debug功能

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

(1.首先打开DOSBox

(2.输入debug

​ -r

在这里插入图片描述

CS=0740,IP=0100,内存 0740:0100 处的指令为CPU当前要读取、执行的指令。在所有寄存器的下方,Debug列出了CS:IP所指向的内存单元为 0740:0100,此处存放的机器码为 0000 ,对应的汇编指令为ADD [BX+SI],AL

(3.-r ax (回车后输入1111如下图在输入r)

在这里插入图片描述

(4.用Debug的D命令查看内存中的内容

在这里插入图片描述

在这里插入图片描述

(4.用debug的E命令来改写内存中的内容

在这里插入图片描述

也可以用E命令向内存中写入字符串,如用E命令从内存0740:0开始写入:数值1,字符串“c++”、字符3、字符串“IBM”

在这里插入图片描述

用E命令将机器码写入内存

机器码 对应的汇编指令
b80100 mov ax,0001
b90200 mov cx,0002
01c8 add ax,cx
(5.用U命令将内存中的内容翻译为汇编指令

在这里插入图片描述

(6.使用debug的T命令可以执行一条或者多条指令,简单地使用T命令可以执行CS:IP指向的指令

在这里插入图片描述

解释:我们首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码;然后用R命令查看CPU中寄存器的状态,可以看到CS=0740H IP=0100H,若要用T命令控制CPU执行我们写到1000:0的指令,必须先让CS:IP指向1000:0,;接着用R命令修改CS、ip中的内容;

之后我们用T命令使得CPU执行我们写到1000:0的指令(执行T命令后,debug显示输出CPU中寄存器状态,AX内容被改为1,IP改为IP+3,)
在这里插入图片描述

继续使用T命令

(7.用A命令以汇编指令的形式在内存中写入机器指令

在这里插入图片描述



版权声明:本文为starmultiple原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。