标签:修改ip bit 连续 长度 指令 定位 相对 程序 实现
补充知识:一个典型的CPU由运算器、控制器、寄存器等器件构成;而对于汇编语言,CPU中的主要部件是寄存器。程序员用指令读写寄存器来实现对CPU的控制。本章研究的是8086CPU
2.1-2.3 寄存器
8086CPU的寄存器都是16位的,可以存放两个字节。其中,用来存放一般性的数据,被称为通用寄存器,它们为AX, BX, CX, DX。
由于8086CPU上一代的CPU的寄存器都是8位的,为了保证兼容,使原来基于上一代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的AX, BX, CX, DX,都可以分为两个可独立使用的8位寄存器来用:AX可分为AH和AL;
BX可分为BH和BL;
CX可分为CH和CL;
DX可分为DH和DL;
字节:byte,一个字节由8个bit组成,可以存在在8位寄存器中;
字:两个字节,分别称为高位字节和低位字节
汇编指令
mov 和add
mov a, b 指把a=b;a通常是寄存器,如:mov ax,18指将18送入寄存器ax
add a, b指a=a+b; a通常是寄存器,如:add ax,18指将寄存器ax的数值加上18
注意:
由于通用寄存器只能存储16位的数据,所以如果将一个大于16位的数据放入寄存器就会损失最高位;
使用add,mov指令时,只能对相同类型的寄存器操作,即只能ax,bx,cx,dx之间操作不能,ax,ah等之间操作。
2.4-2.8 物理地址的存储方式
首先,我们要知道,所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元都有唯一的地址,我们将这个唯一的地址称为物理地址。
我们所研究的8086CPU它的寄存器都是16位的,但是它的地址总线有20根,即它能访问的内存地址1MB,但CPU一次性处理,传输,暂时存储的地址为16位的地址。
所以,8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
即物理地址=段地址*16+偏移地址。可写成段地址:偏移地址
物理地址=段地址*16+偏移地址的本质含义:CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
段地址的概念:段并不是指内存是分段的,段的划分来自于CPU,是因为8086CPU用“物理地址=段地址*16+偏移地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。以后,在编程是可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。一个段的长度最大为64KB。
2.9-2.12 CS和IP
8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。段地址在CS寄存器中存储,偏移地址在IP寄存器中存储。
CS*16+IP即指令的物理地址
计算机的工作过程是:取指令、分析指令、执行指令。
第一步:CPU基于CS:IP,计算出物理笛子,然后到相应的内存单元读取指令,送到指令缓冲区
第二部:CPU自动修改IP的值,IP=IP+所读取指令的长度,从而为下一条指令读取做准备;
第三步:执行指令。转第一步,重复此过程。
如何修改CS:IP的值?
有一个jmp指令
若同时修改CS、IP的内容:jmp 段地址:偏移地址;
若仅修改IP:jmp 某一合法寄存器 用寄存器中的值修改IP
标签:修改ip bit 连续 长度 指令 定位 相对 程序 实现
原文地址:https://www.cnblogs.com/LANBABA/p/9787233.html