女包建设网站前的市场分析,专业网页制作的公司,北京清控人居建设集团网站,苏州网络自学网站建设语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[add…语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[address]mov add sub 1、CPU组成
一个CPU由运算器、控制器、寄存器等器件构成这些器件靠内部总线相连。 运算器进行信息处理寄存器进行信息储存控制器控制各种器件进行工作内部总线连接各种器件在它们之间进行数据的传递 内部总线实现CPU内部各个器件之间的联系外部总线实现CPU和主板上其他器件的联系。不同CPU寄存器的个数、结构是不相同的。8086CPU有14个寄存器AX BX CX DX SI DI SP BP IP CS SS DS ES PSW这些寄存器都是16位二进制。 其中4个段寄存器CS、DS、SS、ES
2、通用寄存器
AX BX CX DX这四个寄存器通常用来存放一般性的数据被称为通用寄存器不同CPU的通用寄存器的大小不一样有8位16位等等。8086CPU的所有寄存器都是16位可以存放两个字节
16位寄存器的存储 16位寄存器兼容8位
8086CPU的上一代CPU中的寄存器都是8位的为了了保证兼容使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用 AX可分为 AH ALBX可分为 BH BLCX可分为 CH CLDX可分为 DH DL AX的低8位(0位7位)构成了AL寄存器高8位(8位15位构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。下图展示了16位寄存器及它所分成的两个8位寄存器的数据存储的情况。 word 和 byte
字节byte一个字节由8个bit组成可以存放在8位寄存器中字word一个字由两个字节组成分别称为这个字的高位字节和低位字节CPU中用16位寄存器来存储一个字一个字占据两个内存单元2字节。高8位存放高位字节低8位存放低位字节。 上图中我们从0地址开始存放4E20H低8位存放20高8位存放4E。地址0、1可以看成一个字单元。有两个概念可以普及下 0地址单元中存放的字节型数据是20H0地址字单元中存放的字型数据是4E20H 上述概念总结如下任何两个地址连续的内存单单元N号单元和N1号单元可以将它们看成两个内存单元也可看成一个地址为N的字单元中的高位字节单元和低位字节单元。
进位问题
例子1高位进位
MOV AX,8226H
MOV BX,8226H
ADD AX,BX
AX BX都是16位寄存器此时AX的值是多少答案8226H 8226H 1044CH但是寄存器只能放16位AX的值是044CH例子2低位进位
MOV AX,00C5H
ADD AL,93H
此时AX的值是多少答案AL原始是C5H加上93H等于158H但是AL只是低8位寄存器作为一个独立的8位寄存器最高位1会丢失丢失1也不会给AH类似最终结果AX0158CPU并没有真的丢弃这个值所以最终的AX0058例子3
MOV AX,00C5H
ADD AX,93H
此时AX的值是多少
AX00C5H 0093H 0158H,AX是16位寄存器能正常进位例子4指令的操作对象位数不一致以下都是错误的指令
mov ax,bl 在8位寄存器和16位寄存器之间传送数据
mov bh,ax 在16位寄存器和8位寄存器之间传送数据
mov al, 20000 8位寄存器最大可存放值为255的数据
add al,100H 将一个高于8位的数据加到一个8位寄存器中3、地址加法器
8086CPU有20位地址总线似乎多余了内部只能送出16位地址寻址能力只有64KB但是实际有1M的寻址能力。8086CPU在内部用两个16位地址合成形成一个20位物理地址 两个16位寄存器一个段地址、另一个偏移地址段地址和偏移地址通过内部总线送入一个地址加法器的部件合成一个20位的物理地址 地址加法器采用物理地址段地址x16偏移地址8086CPU要访问地址123C8H20位长度的内存单元 对于一个16位的CPU偏移地址范围0000H~FFFFH如果段地址1000H则该内存空间的地址范围 1000H * 16 0000H ~ 1000H * 16 FFFFH 10000H ~ 1FFFFH 总共2^166553664KB个内存单元 不同的段地址和偏移地址表示同一个物理地址
下面的几个段地址:偏移地址最终表示的物理地址都是21F60H 偏移地址的范围
偏移地址16位变化范围0FFFFH最多是21664KB个内存单元。如果给定一个段地址1000H则这段寻址范围10000H1FFFFH一个段的长度最大为64KB
一个段的起始地址一定是16的倍数
物理地址段地址x16偏移地址16位偏移地址的范围0~FFFFH所以一个段的起始地址一定是16的倍数
4、CS:IP
CS IP工作过程
CS和IP是8086CPU中最为关键的寄存器它指出了当前要读取指令的地址。CS寄存器存储段地址IP寄存器存储偏移地址CS:IP组成真真的程序入口的物理地址。每读取一次指令IPIP所读取指令的长度从而指向下一条指令8086CPU工作过程初始化状态CS2000 IP0000 地址加法器 输入输出控制电路 20位地址总线 读取内存中的数据 指令缓冲器 IP增加 执行控制器 AX0123H 读取2000:0003处的指令 执行mov bx,0003H最终BX0003H 读取2000:0006处的指令 执行mov ax,bx最终AX0003 BX0003 读取2000:0008处的指令add ax,bx 01D8 执行指令add ax,bx 01D8最终结果AX0003BX0003 8086CPU工作过程简要概述
1从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器: 2IPIP所读取指令的长度,从而指向下一条指令; 3执行指令。转到步骤(1),重复这个过程。
jmp修改CS:IP
MOV CS,AAAAH 这种写法是错误的8086CPU不支持将数据直接送入段寄存器CPU提供了jmp指令用于修改段寄存器的值例子1mov不能修改段寄存器的值 例子2jmp修改IP寄存器直接写入数据 073F:0100 写入指令 jmp 1234执行后IP1234 例子3jmp修改IP寄存器用其他寄存器的值 073F:0100 写入指令 mov ax,1111执行后AX1111073F:0103 写入指令 jmp ax执行后最终IP的值等于AX的值IP1111 例子4jmp同时修改CS:IP寄存器的值 073F:0100 写入指令 jmp 0700:2222执行后 CS0700 IP2222 5、DS和[address]
DS和[address]
[address]表示内存单元的偏移地址8086CPU自动取DS寄存器中的数据为段地址例子1 073F:0100 写入指令 mov ax,[011E]执行后mov ax,[011E]就是将DS作为段地址 011E作为偏移地址073F:011E的值放到AX寄存器中此时073F:011E低8位存储2E073F:011F高8位存储07最终结果AX072E 例子2 例子3 mov add sub
mov指令访问内存单元时mov指令只给出单元的偏移地址段地址默认在DS寄存器中mov指令可以有以下几种形式
mov 寄存器,数据 比如:mov ax,8
mov 寄存器,寄存器 比如:mov ax,bx
mov 寄存器,内存单元 比如:mov ax,[0]mov 内存单元,寄存器 比如:mov [0],ax
mov 寄存器,内存单元 比如:mov ds,[0]mov 段寄存器,寄存器 比如:mov ds,ax
mov 寄存器,段寄存器 比如:mov ax,ds