寄存器详解(一)

目录

前言:

通用寄存器

示例:

 通用寄存器的划分

 汇编指令

cpu物理地址的形成

地址加法器运算示例:

1. 相关部件提供段地址和偏移地址

 2. 段地址和偏移地址送入地址加法器

 3. 段地址*16

4. 求出物理地址

 5. 输出物理地址

段的概念

Debug的使用

1.用R命令查看,改变CPU寄存器的内容

2.用D命令查看内存中的内容

 3.用E命令改变内存中的内容

4.用U命令将内存中的机器指令翻译成汇编指令

5. 用A命令以汇编指令的格式在内存中写入机器指令

 6. 用T命令执行CS:IP处的机器指令

代码段寄存器CS与指令指针寄存器IP

修改CS与IP的指令


前言:

CPU由运算器,控制器,寄存器等器件构成,这些器件依靠内部总线相连;

在CPU中,运算器进行信息处理,寄存器进行信息存储,控制器控制各种器件进行工作,内部总线连接各种器件,在它们之间进行数据的传送

CPU中主要部件是寄存器,寄存器是CPU中可以用指令读写的部件,程序员可以各种寄存器中的内容实现对CPU的控制;

鉴于不同的CPU,寄存器的个数,结构是不同的,下述皆以8086CPU为例;

通用寄存器

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

2. 用来存放一般性的数据,称之为通用寄存器,分别为AX BX CX DX;

示例:

数据: 18

二进制序列: 10010

寄存器AX中的存储情况:

寄存器详解(一)_第1张图片

 通用寄存器的划分

1. 由于8086CPU上一代是8位,为保证兼容性,所以将8086CPU中的AX BX CX DX这四个寄存器都可划分为两个独立使用的8位寄存器使用;

2. 通用寄存器AX的低8位(0位-7位)构成了AL寄存器,高8位(8位-15位)构成了AH寄存器;

    AH,AL寄存器是可以独立使用的8位寄存器

3. 同理,BX可分为BH与BL,CX可分为CH与CL,DX可分为DH与DL;

示例图:

寄存器详解(一)_第2张图片

 汇编指令

8086CPU一次性可以处理俩种数据

1. 字节:记为byte,1个字节由8个bit组成,可以储存在8位寄存器当中;

2. 字: 记为word , 1个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节;高位字节存储于通用寄存器中XH中,低位字节存储于通用寄存器XL中(X可取A B C D);

汇编指令举例
汇编指令 控制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中的值:0000H                 BX中的值:0000H
程序段中的指令 指令执行后AX中的数据 指令执行后BX中的数据
 mov ax,4E20H 4E20H 0000H
add ax,1406H 6226H 0000H
mov bx,2000H 6226H 0000H
add ax,bx 8226H 2000H
mov bx,ax 8226H 8226H
add ax,bx 044CH 8226H

cpu物理地址的形成

CPU访问内存单元时,必须给出内存单元的地址;

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

8086CPU具有如下结构特性:

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

2. 寄存器最大宽度是16位;

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

即在8086CPU内部,可以一次性处理,传输,暂时存储的信息最大长度是16位,也就是8086CPU只能送出16位的地址,表现出的寻址能力只有64KB,但是8086CPU有20根地址总线,可以传送20位地址,达到1MB的寻址能力,为了处理这种矛盾,8086CPU采用一种在内部用两个16位的地址合成一个20位的物理地址的方法

寄存器详解(一)_第3张图片

 8086CPU读写内存时:

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

地址加法器采用 段地址*16 + 偏移地址=物理地址 的方法合成物理地址;

地址加法器运算示例:

1. 相关部件提供段地址和偏移地址

寄存器详解(一)_第4张图片

 2. 段地址和偏移地址送入地址加法器

寄存器详解(一)_第5张图片

 3. 段地址*16

寄存器详解(一)_第6张图片

4. 求出物理地址

寄存器详解(一)_第7张图片

 5. 输出物理地址

寄存器详解(一)_第8张图片

 段地址*16+偏移地址=物理地址的本质含义是当CPU访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址

段的概念

内存是一个由若干存储单元组成的逻辑存储器,内存并没有分段,段的划分来自于CPU;

CPU用 段地址*16+偏移地址=物理地址 的方式给出内存单元的地址,使得我们可以用分段的方式管理内存;

示例:

寄存器详解(一)_第9张图片

 我们可以认为地址10000H-100FFH组成了一个段,该段的起始地址为10000H,段地址为1000H,大小为100H;

在编程时根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址,用偏移地址定位段的内存单元,注意以下两点

  • 段地址*16必然是16的倍数,所以一个段的起始地址为16的倍数;
  • 偏移地址为16位,即变化范围为0000H - FFFFH,寻址能力为64kb,所以一个段的长度最大为64KB

Debug的使用

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

1.用R命令查看,改变CPU寄存器的内容

  • R — 查看寄存器的内容
  • R 寄存器名称 — 改变指定寄存器的内容

寄存器详解(一)_第10张图片

 寄存器详解(一)_第11张图片

2.用D命令查看内存中的内容

  • D - 列出预设地址内存处的128个字节的内容
  • D 段地址:偏移地址-列出内存中指定地址处的内容
  • D 段地址:偏移地址 结尾偏移地址 - 列出内存中指定地址范围内的内容

寄存器详解(一)_第12张图片

 寄存器详解(一)_第13张图片

 

 3.用E命令改变内存中的内容

  •  E段地址:偏移地址 数据1 数据2 ...
  •  E 段地址:偏移地址  (逐个询问式修改,空格-接受,继续   回车-结束)

寄存器详解(一)_第14张图片

 

4.用U命令将内存中的机器指令翻译成汇编指令

  • E 段地址:偏移地址 数据-以机器码的形式写入内存
  • D 段地址:偏移地址 - 查看机器码写入内存是否成功
  • U 段地址:  偏移地址 - 查看机器码所对应的汇编指令

寄存器详解(一)_第15张图片

5. 用A命令以汇编指令的格式在内存中写入机器指令

  • a 段地址:偏移地址 — 写入汇编指令
  • d 段地址:   偏移地址 — 查看汇编指令所对应的机器码
  • u 段地址:   偏移地址 — 查看代码

寄存器详解(一)_第16张图片

 6. 用T命令执行CS:IP处的机器指令

寄存器详解(一)_第17张图片

代码段寄存器CS与指令指针寄存器IP

任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从物理地址=M*16+N的内存单元读取一条指令并执行;

即任意时刻,CPU将CS:IP指向的内容当做指令执行;

寄存器详解(一)_第18张图片

CPU工作过程:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
  2. IP中的值自动增加,使得CPU可以读取下一条指令此时IP指向下一条指令
  3. 执行指令(回到步骤1,重复此过程)

修改CS与IP的指令

能够修改CS IP的指令统称为转移指令,简介可以修改CS IP 的jmp指令

  • 同时修改CS IP ;可以采用 jmp 段地址:偏移地址; 该指令的功能是用指令给出的段地址修改CS ,偏移地址修改IP;
  • 只修改IP的内容 ;jmp 某一合法寄存器 ;该指令的功能用寄存器中的值修改IP

你可能感兴趣的:(开发语言,c语言)