• 汇编语言:第二章 寄存器


    一个典型的CPU由运算器、控制器、寄存器组成,内部总线连接各部分器件

    寄存器是程序员可以用指令读写的部件,通过改变寄存器里的内容从而实现控制CPU,

    不同CPU 寄存器的个数结构是不一样的,8086有14个寄存器

    2.1通用寄存器

      8086所有的寄存器都是16位的,可以存放2个字节,AX、BX、CX、DX用于存放一般性数据,成为通用寄存器

      为了兼容旧的8位寄存,每个16位寄存器可以分为2个单独的8位寄存器来使用,名字分别用AH、AL来表示高8位和低8位

    2.2字在寄存器中的存储

      字节byte:可以存储在8位寄存器中

      字word:是两个字节,可以存储在16位寄存器中,改字的高8位字节和低8位字节存储在高8位寄存器和低8位寄存器中

      一个字型数据20000  存储在AX中,高8位是78,低8位是32, 既可以看成是一个字型数据20000,也可以看成是两个单独的寄存器分别存78和32

      十六进制数据每两位代表一个8位,用十六进制表示数据来看高低位寄存器非常方便如AX中是4E20H,那么AH是4EH,AL是20H。

    2.3几条汇编指令

      mov ax,18   : 将18送入寄存器AX    高级语言:ax=18

      add ax,8  : 将寄存器AX中数据加8    高级语言:ax=ax+8

      注意:如果运算结果超出了寄存器可以表示的数值范围,那么会截取掉

      汇编指令的操作对象位数必须是一样的

    检测2.1:

      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>只用mov,add指令并且不超过4条指令计算2的4次方

      mov ax,0002H

      add ax,ax

      add ax,ax

      add ax,ax

    2.4物理地址

      CPU访问内存需要提供内存单元地址,所有的内存单元在内存空间中构成的是一个一维线性结构,

      每个内存单元都有一个唯一的地址,这个地址就是物理地址。

      CPU在访问内存时得先在内部形成这个地址,那么是如何形成的呢?

    2.5 16位结构CPU

      16位结构的CPU表示:

      1.CPU运算器一次运算位数最大为16位

      2.CPU寄存器宽度为16

      3.运算器和寄存器通路为16位

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

      8086地址总线宽度为20,但是一次运算位数最大为16,所以通过两个16位地址合成一个20位地址

      物理地址=段地址(SA)*16 + 偏移地址(EA)

      段地址乘以16就是左移4位

      

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

      段地址*16 代表一个基础地址(参照地址), 偏移地址是在这个基础地址之上的偏移量

    2.8 段的概念

      内存并没有分段,段的概念来自于CPU,使得我们利用分段方式来管理内存

      由于偏移地址是16位的,所以每个段的最大长度就是16位地址的寻址能力: 64KB

      

    [注] 1)不同的段地址和偏移地址可以表示同一个物理地址,只要计算结果相同即可

      2)描述数据存在某个内存单元一般这么说:  数据存在内存的2000段中的1F16单元中

      3)可以根据需要将起始地址为16整数倍并且连续不超过64KB的内存单元划分为一个段

    检测2.2

      1)给定段地址0001H,寻址范围从 00010H1000FH

      2)某数据存在20000H中,利用段地址*16+偏移方式想寻到此地址,那么SA最小为: 1001H 最大为:2000H

    2.9 段寄存器

      从图2.6可知,其他部件提供了段地址和偏移地址给地址加法器,这里的其他部件就包含段寄存器,用于提供段地址

      8086段寄存器包含CS,DS,SS,ES

    2.10 CS和IP

      CS和IP是8086里最重要的寄存器,它们提供CPU当前需要执行的指令地址

      CS段寄存器,IP偏移寄存器

      8086CPU工作过程如下:

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

      2) IP=IP+指令长度

      3)执行指令,转向1)重复

      8086CPU在开机时CS:IP会被指向FFFFH:0000H执行开机第一条命令

    2.11修改CS IP指令

      mov不能对CS IP操作

      1>使用jmp 段地址:偏移地址 来修改CS,IP

      2>使用jmp 某寄存器(如ax)   将ax值放到IP中

    2.12代码段 

      某起始地址是16整数倍且连续的一段内存单元可以看成是一个代码段,

      将CS:IP设置为该段起始值就可以让CPU执行该段代码

    检测2.3:

      下面3条指令执行之后IP修改了几次,什么时候,最终IP是什么?

      mov ax,bx

      sub ax,ax

      jmp ax

      解: 4次,每条指令读取进指令缓存器中时IP修改一次,jmp命令执行之后又执行一次,最终是0000H

      

  • 相关阅读:
    Mysql实战面试题
    初探Google Guava
    Spring IOC核心源码学习
    用3句话像老太太讲清楚什么是数据库
    matlab如何读入mat型的矩阵
    工作记忆数据处理
    功能连接
    奖励学习
    格兰杰因果关系及其在医学影像数据中的应用
    GC wm
  • 原文地址:https://www.cnblogs.com/superzhao/p/4600617.html
Copyright © 2020-2023  润新知