汇编小记16/3/22

最后一次更新:2016-03-23 12:40:34


 学了cpu和内存的关系(存储器),接下来了解cpu的内部构建

cpu内部是由运算器、控制器、存储器cpu工作原理)等器件构成

通过内部总线想和连接(和外部的三大总线对比)

运算器:cpu内部数据处理的场所

控制器:控制cpu内部各器件的运作

寄存器:信息存储

内部总线:连接各个器件,进行数据传送


cpu的主要部件是寄存器,寄存器是程序员进行可以用以读写操作的场所,也就是说程序员可以通过对寄存器的内容的改变来实现对cpu的控制

cpu可以细分成14种:

通用寄存器、指令指针寄存器、代码段寄存器、数据段寄存器、附加段寄存器、堆栈段寄存器0-待续

这节介绍通用寄存器:以AX为例

通用寄存器用以存储一般数据

8086为例,AX可以存放16位数据

8086以上的寄存器是8器是8位的,为了实现向下兼容,每一个16位寄存器又可以分为2个8位寄存器

  • AX分为AH和AL
  • BX分为BH和BL
  • CX分为CH和CL
  • DX分为DH和DL

可以看出8位寄存器可以存放1B数据,即一个字节

16位寄存器可以存放1W数据,即两个字节

字(2B)数据在AX存储时满足高高低低原则

比如,2000 = 4E20H

AH 存储 4EH 逻辑数为78

AL 存储 20H 逻辑数为32


通用寄存器相关汇编指令:

move ax,62627 先要62627(D)转化为16进制,覆盖掉ax中原有的数

mov ah,31H

add ax,ax

add al,bh

add al,6


内存地址逻辑上是一维的线性地址,讨论cpu如何给发出地址信息:

16位结构的cpu

  • 运算器一次最大的数据为16位
  • 寄存器的最大宽度为16位
  • 寄存器与运算器之间的通路(内部总线)为16为

8086cpu的地址总线宽度为20,有1MB的寻址能力,但是cpu一次最多能处理、存储、运算16位数据

如何解决这个矛盾,能让cpu只处理一次,就能找到宽度为20的内存物理地址

8086cpu通过两个16地址合成的方法形成一个20位物理地址

cpu需要处理读写内存是:发出内存发出地址信息

  1. cpu内部器件形成两个16地址信息,一个称段地址,另一个称为偏移地址
  2. 段地址和偏移地址通过cpu的内部总线,送到地址加法器部件
  3. 地址加法器16位地址合成一个20位地址
  4. 地址加法器通过内部总线将合成的20位地址送到输入输出控制电路
  5. 输入输出控制电路将20位物理地址送上地址总线
  6. 地址总线将20位物理地址送到内存(存储器 )

地址加法器采用的处理方法是:

物理地址 = 段地址*16+ 偏移地址

例子:

1230H(段地址)

    +            =         12300H        =        123C8H(物理地址)

 (地址加法器)       00C8H

00C8H(偏移地址) 

 本质意义:cpu内部无法一次存储20位信息的数据,只能通过某种数学方法处理 

 物理地址 = 基础地址(段首地址) + 偏移地址

cpu将内存分成n个段,n个段中有m个最小存储单元

可以推出:

段首地址一定是16的倍数; 

而cpu一次最大能处理16bit数据,也就是偏移地址最大位2^16-1,也就是说每个段的最大为64KB(2^16B FFFF)            

可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段


段寄存器:提供给地址加法器段地址的器件(存储段地址)

8086一共有4个段地址寄存器:CS、DS、SS、ES

CS和IP(固定搭配)

CS是代码段地址(段地址) IP是指令指针寄存器(偏移地址)

cpu通过CS+IP向内存发出地址信息,代码段中的指令通过数据总线,进入到cpu内部的指令缓存区,此时IP自动增加,IP指向下一条指令,指令缓冲区的指令执行

任意时刻,cpu将CS:IP指向的内容当作指令执行

代码段(<=64KB)


代码段寄存器相关汇编指令:

可以通过jmp改变CS、IP中的内容

jmp 2AE3:3 执行后:CS=2AE3H,IP=0003H,cpu将从2AE33H中读取指令

若只想修改IP中的内容

jmp ax 执行后,ax中的内容将会覆盖IP中的内容 ,含义上类似:mov IP ax


在一个谎言的国度,沉默就是英雄
原文地址:https://www.cnblogs.com/EdsonLin/p/5309346.html