1.通用寄存器


存放一般性数据的寄存器称为通用寄存器,8086CPU有14个寄存器,它们都是16位(bit)的,可以存放2个字节。其中通用寄存器是AX至DX四个。为了保证向上兼容,四个寄存器都可以分成两个独立使用的8位寄存器来使用。

例如AX可以分为AH和AL,也就是高8位和低8位的两个寄存器。

2.字的存储

CPU可以一次性处理两种尺寸的数据。

第一种是字节(byte),由8bit组成,可以存在8位寄存器中。另一种是字(word),由两个byte组成,它们分别称为这个字的高位字节和低位字节。


一个字存在16位寄存器里的时候,高位字节和低位字节自然就存储在高8位和低8位寄存器中。例如AH和AL中的数据,既可以看成一个字型数据的高8位和低8位,也可以看成两个独立的字节(byte)型数据。

16进制可以用两位数表示二进制的8位数,比如20000写成4E20就表示该数据由4E和20组成。如果AX中存放它,那么AH中就是4E,AL中则是20。

3.汇编指令

几条基本的汇编指令:

mov ax,18:将18送入寄存器AX

mov ah,78:将78送入寄存器AH

add ax,8:将寄存器AX中的数值加上8

mov ax,bx:用BX中的数值覆盖AX

add ax,bx:用BX和AX中的数值之和覆盖AX


值得注意的问题是数值超过最大表示范围的问题,假如使用的是AL,那么超出的部分不会存放在AH,因为此时两个寄存器被视为相互独立的单元。但如果使用的是AX,那么当数值超出8位最大范围后,超出部分会存储在高位寄存器中。

如何用不超过4条汇编指令编程计算2的4次方?

使用迭代法,写成汇编语句:

mov ax,2
add ax,ax
add ax,ax
add ax,ax

4.物理地址

CPU通过地址总线发送物理地址前,必须先在内部形成这个地址。


8086是16位的CPU,也就是说,内部一次能够处理、传输和暂时存储的信息最大长度是16位的。8086地址总线宽度是20,如果直接将地址从内部发出,只能送出16位,所以必须先在CPU内部合成地址。


8086采用物理地址=段地址*16+偏移地址的办法来合成物理地址。对16进制的数,乘上16相当于左移1位,这又等价于2进制的数左移4位。所以其逻辑意义是,16位的基础地址(二进制)左移4位,从而可以间接表示20位的地址。

两个16位的地址通过内部总线送入地址加法器,由地址加法器合成之后,通过输入输出控制电路送到地址总线。

不同的段地址+偏移地址可以合成同一个物理地址。

5.段寄存器


段地址在段寄存器中存放,8086CPU中有4个段寄存器:CS,DS,SS,ES。CS结合指令指针寄存器IP,指示当前要读取的指令地址。能改变CS和IP内容的指令被称为转移指令。如jump
2AE3:3,执行后CS内容为2AE3H,IP内容为0003H, jump ax: 将ax寄存器中的数据传给CS。

指令和数据在内存中没有任何区别都是二进制数字,只是根据储存的位置不同来加以区分,CS:IP中的内容就被视为指令。

6.代码段

一组内存单元可以被定义为一个代码段,为了使CPU执行这段代码,需要让CS:IP指向代码段的首地址。然后依次执行代码段中的指令。

技术
©2020 ioDraw All rights reserved
2020前端学习路线收集整理【C语言】乘法表29岁“退休程序员”郭宇: 有钱的人不一定自由,自由的人不一定有钱python gui界面实例-Python GUI编程完整示例pytorch训练过程中GPU利用率低学习java 的第一节课vue element-ui实现input输入框金额数字添加千分位对于面试官的问答: 你在项目组里拿到一个项目是怎么开展的呢???算法题的输入大总结小程序表单中 多个循环input 如何取每个input的值