汇编学习Day2

第二章 寄存器

  • 一个典型的cpu由运算器、控制器、寄存器的能器件构成,这些器件靠内部总线相连。在cpu中
  1. 运算器进行信息处理
  2. 寄存器进行信息存储
  3. 控制器控制各种器件进行工作
  4. 内部总线连接各种器件,在他们之间进行数据的传送
  • 不同cpu,寄存器的个数、结构是不相同的。8086cpu由14个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、BP、IP、CS、SS、DS、ES、PSW。

2.0 基本程序运行寄存器

  • 基本程序运行寄存器由4类寄存器组成:
    • 通用寄存器(32位,8个)
      • EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP->32位
        • EAX:(针对操作数和结果数据的)累加器
        • EBX:(DS段中的数据指针)基址寄存器
        • ECX:(字符串和循环操作)计数器
        • EDX:(I/O指针)数据寄存器
        • ESI:(字符串操作源指针)源变址寄存器
        • EDI:(字符串操作目标指针)目的变址寄存器
        • ESP:(SS段中栈指针)栈指针寄存器
        • EBP:(SS段中栈内数据指针)扩展基址指针寄存器
    • 段寄存器(16位,6个)
      • CS,DS,SS,ES,FS,GS->16位
        • CS:代码段寄存器
        • SS:栈段寄存器
        • DS:数据段寄存器
        • ES:附加(数据)段寄存器
        • FS:数据段寄存器
        • GS:数据段寄存器
    • 程序状态与控制寄存器(32位,1个)
      • EFLAGS->32位
    • 指令指针寄存器(32位,1个)
      • EIP->32位

2.1 通用寄存器

  • 8086cpu的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这四个寄存器通常用来存放一般性数据,被称为通用寄存器。
  • AX寄存器逻辑结构
    在这里插入图片描述

一个16位寄存器可以存储一个16位的数据,数据在寄存器中的存放情况如图所示

  • 8086cpu上一代cpu中寄存器都是8位的,位保证兼容,使原来基于上代的cpu编写的程序稍加修改就可以运行在8086之上,8086cpu的AX、BX、CX、DX这四个寄存器都可分为两个可独立使用的8位寄存器来用:
  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

数据:18
二进制表示:10010
在寄存器AX中的存储:
在这里插入图片描述

数据:20000
二进制表示:1001111000100000
在寄存器AX中的存储:
在这里插入图片描述

以AX为例,8086cpu的16位寄存器分为两个8位寄存器的情况在这里插入图片描述

  • AX的的低8位(0-7位)构成了AL寄存器,高8位(8-15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。
不同的寄存器

32168位
EAX    AX    AL
ECX    CX    CL 
EDX    DX    DL
EBX    BX    BL
ESP    SP    AH
ENP    NP    CH
ESI    SI    DH
EDI    DI    BH

8位:L为低8位,H为高8位

  • 16位寄存器及其所分成的两个8位寄存器的数据存储情况:
    16位寄存器及其所分成的两个8位寄存器的数据存储情况

2.2 字在寄存器中的存储

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

在这里插入图片描述
一个字可以存在16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。

2.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中的数据送入寄存器AX中AX=BX
add ax,bx将AX和BX中的数值相加,结果存在AX中AX=AX+BX
  • 在写一条汇编指令或一个寄存器的名称时不区分大小写

程序段中指令的执行情况之一(AX值:0000H,BX值:0000H)

程序段中的指令执行指令后AX数据执行指令后BX数据
mov ax,4E20H4E20H0000H
add ax,1406H6226H0000H
mov bx,2000H6226H2000H
add ax,bx8226H2000H
mov bx,ax8226H8226H
add ax,bx044CH8226H
  • 8226H+8226H=1044CH,为什么上表为044CH呢?执行前ax,bx为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制数据,所以这个值最高位1不能在ax中
指令执行后AX数据执行后BX数据
mov ax,001AH001AH0000H
mov bx,0026H001AH0026H
add ah,bl0040H0026H
add ah,bl2640H0026H
add bh,al2640H0026H
mov ah,00040H4026H
add al,85H00C5H4026H
add al,93H4026H
  • al为低8位寄存器,只能存放两位十六进制的数据。所以C5H+93H=158H的1就被丢失,ax数据为0058H

2.4物理地址

  • 我们知道,CPU 访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
  • CPU 通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址的。

2.5 16位结构的cpu

  • 8086cpu的上一代(8085、8080)等都是8位机,而8086是16位机。

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

8086cpu相关部件的逻辑结构如图所示
在这里插入图片描述

  • 当8086cpu要读写内存时:
  1. CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  3. 地址加法器将两个16位地址合成为一个20位的物理地址;
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
  5. 输入输出控制电路将20位物理地址送上地址总线;
  6. 20位物理地址被地址总线传送到存储器。
  • 地址加法器采用物理地址=段地址+偏移地址的方法用段地址和偏移地址喝成物理地址。例如,8086cpu要访问地址为123C8H的内存单元,工作过程如图:
    在这里插入图片描述
  • 由段地址×16引发的讨论
  • “段地址×16”有一个更为常用的说法是左移4位。计算机中的所有信息都是以二进制的形式存储的,段地址当然也不例外。机器只能处理二进制信息,“左移4位”中的位,指的是二进制位。
  • 我们看一个例子,一个数据为2H,二进制形式为10B,对其进行左移运算:
左移位数二进制十六进制十进制
010B2H2
1100B4H4
21000B8H8
31000B10H16
4100000B20H32
  • 观察上面移位次数和各种形式数据的关系,我们可以发现:
    (1)一个数据的二进制形式左移1位,相当于该数据乘以2;
    (2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
    (3)地址加法器如何完成段地址×16的运算?就是将以二进制形式存放的段地址左移4位。
  • 进一步思考,我们可看出:一个数据的十六进制形式左移1位,相当于乘以16;一个数据的十进制形式左移1位,相当于乘以10:一个X进制的数据左移1位,相当于乘以X。

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

  • “段地址16+偏移地址=物理地址”的本质含义是:cpu在访问内存时,用一个基础地址(段地址16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
  • 比如只能通过纸条来互相通信,现在要传达2826这个数据,显然需要4位数据的纸条才能写下2826

在这里插入图片描述

  • 可是现在仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉你2826这个数据
    -在这里插入图片描述
  • 在一张纸条上写上200(段地址),第二张纸条上写上826(偏移地址)。现在又有这样的约定:得到两张纸条后需要进行这样的运算:200(段地址)*10+826(偏移地址)=2826(物理地址)
  • 8086就是这样一个只能提供两张3位数数据的cpu

2.8段的概念

  • 内存并不分段,段的划分来自于cpu,由于8086cpu用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。如图所示,我们认为:地址1000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为1000H,段地址为1000H,大小为100H;

  • 我们也可以认为地址10000H~1007FH、10080H-100FFH的内存单元组成两个段,它们的起始地址为:10000H和10080H,段地址为1000H和1008H,大小都是80H
    在这里插入图片描述

  • 分段:以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

2.9 段寄存器

  • 我们前面讲到,8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。这里,需要看一下,是什么部件提供段地址。段地址在8086CPU 的段寄存器中存放。8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS。

2.10 CS和IP

  • CS和IP是8086cpu中两个最关键的寄存器,它们指示了cpu当前要读取指令的地址。CS伪代码段的局存起,IP为指令指针寄存器,从名称上我们可以看出他们和指令的关系
  • 在8086CPU中,任何时刻,设CS中的内容为M,IP中的为N,8086cpu将从内存M*16+N单元开始,读取一条指令并执行
  • 8086cpu中,任意时刻cpu和CS:IP真香的内容当做指令执行

8086PC读取和执行指令的相关部件
在这里插入图片描述

  1. 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;
  2. 内存20000H~20009H单元存放着可执行的机器码;
  3. 内存20000H~20009H单元中存放的机器码对应的汇编指令如下。
  • 地址:20000H~20002H,内容:B823 01,长度:3Byte,对应汇编指令:mov ax,0123H
  • 地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H
  • 地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令: mov ax,bx
  • 地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令: add ax,bx
  • 下面的一组图描述的情况为初始状态,展示8086cpu读取、执行一条指令的过程。

初始状态(CS:2000H,IP:0000H,CPu将从内存2000H*16+0000H处读取指令执行)
在这里插入图片描述


CS、IP中的内容送入地址加法器(地址加法器完成:物理地址=段地址*16+偏移地址)
在这里插入图片描述


地址加法器将物理地址送入输入输出控制电路
在这里插入图片描述


输入输出控制电路将物理地址20000H送上地址总线
在这里插入图片描述


从内存20000H单元开始存放的机器指令B8 23 01通过数据总线被送入CPU
在这里插入图片描述


输入输出控制电路将机器指令B8 23 01 送入指令缓冲器
在这里插入图片描述


IP中的值自动增加(读取一条指令后,IP中的值会自动增加,以使cpu可以读取下一条指令。因当前读入的指令B82301长度为3个字节,所以IP值加3.此时,CS:IP指向内存单元2000:0003)
在这里插入图片描述


执行控制器执行指令 B8 23 01(即mov ax,0123H)
在这里插入图片描述


指令B8 23 01被执行后AX中的内容0123H
在这里插入图片描述


CS:2000H,IP:0003H(cpu将从内存2000H*16+0003H处读取指令BB 03 00)
在这里插入图片描述


cpu从内存20003H处读取指令BB 03 00入指令缓冲器(IP中的值加3)
在这里插入图片描述


执行指令BB 03 00(mov bx,0003H)
在这里插入图片描述


cpu从内存20006H处读取指令89 D8入指令缓冲器(IP中的值加2)
在这里插入图片描述


执行指令89 D8(即mov ax,bx)后,AX中的内容为0003H
在这里插入图片描述


cpu从内存2008H处读取指令01 D8 入指令缓冲器(IP的值加2)
在这里插入图片描述


执行指令01 D8(即add ax,bx)后,AX中的内容为0006H
在这里插入图片描述

  • 8086cpu工作过程可以简要描述如下:
  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP-IP+所读取指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤(1),重复这个过程。

2.11 修改CS、IP的指令

  • 修改大部分寄存器的值可以用mov传送指令
  • 不可以用mov修改CS、IP
  • 修改CS、IP用jmp指令
  • 若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”的指令完成,如
  • jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
  • jmp 3:0B16,执行后:CS=0003H,IP=OB16H,CPU将从00B46H处读取指令。
  • “jmp段地址:偏移地址”指令的功能为:用指令中给出的地址修改CS,偏移地址修改IP
  • jmp ax在含义上相当于:mov IP,ax

2.12 代码段

mov ax,0000B8 00 00
add ax,0123H05 23 01
mov bx,axB8 D8
jmp bx(FF E3)
  • 这段长度为10个字符的指令,存放在123B0H-123B9H的一组单元中,我们就可以认为,123B0H-123B9H这段内存是用来存放代码的,是一个代码段,他的段地址为123BH,长度10字节
  • 如何使得代码段中的指令被执行呢?将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行。CPU 只认被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。对于上面的例子,我们将一段代码存放在123B0H~123B9H内存单元中,将其定义为代码段,如果要让这段代码得到执行,可设CS=123BH、IP=0000H。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Edison.W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值