目录
前言:
通用寄存器
示例:
通用寄存器的划分
汇编指令
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. 由于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;
示例图:
汇编指令
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中的数据 | 指令执行后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位的物理地址的方法;
8086CPU读写内存时:
- CPU的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址;
- 段地址和偏移地址通过内部总线送入地址加法器;
- 地址加法器将两个16位的地址合成一个20位的物理地址;
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
- 输入输出控制电路将20位物理地址送上地址总线;
- 20位物理地址被地址总线传送到内存。
地址加法器采用 段地址*16 + 偏移地址=物理地址 的方法合成物理地址;
地址加法器运算示例:
1. 相关部件提供段地址和偏移地址
2. 段地址和偏移地址送入地址加法器
3. 段地址*16
4. 求出物理地址
5. 输出物理地址
段地址*16+偏移地址=物理地址的本质含义是当CPU访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址;
段的概念
内存是一个由若干存储单元组成的逻辑存储器,内存并没有分段,段的划分来自于CPU;
CPU用 段地址*16+偏移地址=物理地址 的方式给出内存单元的地址,使得我们可以用分段的方式管理内存;
示例:
我们可以认为地址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 寄存器名称 — 改变指定寄存器的内容
2.用D命令查看内存中的内容
- D - 列出预设地址内存处的128个字节的内容
- D 段地址:偏移地址-列出内存中指定地址处的内容
- D 段地址:偏移地址 结尾偏移地址 - 列出内存中指定地址范围内的内容
3.用E命令改变内存中的内容
- E段地址:偏移地址 数据1 数据2 ...
- E 段地址:偏移地址 (逐个询问式修改,空格-接受,继续 回车-结束)
4.用U命令将内存中的机器指令翻译成汇编指令
- E 段地址:偏移地址 数据-以机器码的形式写入内存
- D 段地址:偏移地址 - 查看机器码写入内存是否成功
- U 段地址: 偏移地址 - 查看机器码所对应的汇编指令
5. 用A命令以汇编指令的格式在内存中写入机器指令
- a 段地址:偏移地址 — 写入汇编指令
- d 段地址: 偏移地址 — 查看汇编指令所对应的机器码
- u 段地址: 偏移地址 — 查看代码
6. 用T命令执行CS:IP处的机器指令
代码段寄存器CS与指令指针寄存器IP
任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从物理地址=M*16+N的内存单元读取一条指令并执行;
即任意时刻,CPU将CS:IP指向的内容当做指令执行;
CPU工作过程:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP中的值自动增加,使得CPU可以读取下一条指令此时IP指向下一条指令
- 执行指令(回到步骤1,重复此过程)
修改CS与IP的指令
能够修改CS IP的指令统称为转移指令,简介可以修改CS IP 的jmp指令
- 同时修改CS IP ;可以采用 jmp 段地址:偏移地址; 该指令的功能是用指令给出的段地址修改CS ,偏移地址修改IP;
- 只修改IP的内容 ;jmp 某一合法寄存器 ;该指令的功能用寄存器中的值修改IP;