汇编 第二章 寄存器(CPU工作原理)

第二章 寄存器(CPU工作原理)

CPU=运算器+控制器+【寄存器】,
cpu内部各个器件之间通过内部总线相连。
cpu和主板其他器件通过外部总线相连。
8086CPU有14个寄存器,名称分别为:
AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

2.1 通用寄存器
1.8086CPU所有的寄存器都是16位的,可以存放2个字节
2.AX、BX、CX、DX通常用来存放一般性数据
	被称为通用寄存器
	最大存储2^16-1
3.8086上一代CPU中的寄存器都是8位的,为了保证兼容性
	这四个寄存器都是可以分为2个独立的8位寄存器使用
	AX=AH+AL(high高位 ,low低位)
	BX=BH+BL
	CX=CH+CL
	DX=DH+DL
4.AX的低8位(0-7)构成AL寄存器
	高8位(8-15)构成了AH寄存器
	AH和AL寄存器是可以独立使用的8位寄存器
2.2 字在寄存器中的存储
8086一个字16位=2byte
2.3 几条汇编指令
1.汇编指令不区分大小写 
2.几条汇编指令
	mov ax,18	;AX=18 
	mov ah,78	;AH=78
	add ax,8	;AX=AX+8
	mov ax,bx	;AX=BX
	add ax,bx	;AX+=BX
3.用目前学过的汇编指令,最多使用四条指令,编程计算2的4次方
	mov ax,2	;ax=2
	add ax,ax	;ax=4
	add ax,ax	;ax=8
	add ax,ax	;ax=16
2.4 物理地址
1.CPU访问内存单元时,要给出内存单元的地址。
2.所有的内存单元够成的存储空间是一个一维的线性空间
3.我们将这个唯一的地址称为物理地址
2.5 16位结构的CPU

下图8086cpu相关部件的逻辑结构
在这里插入图片描述

16位结构描述了一个淳朴具有以下几个方面特征:
    1.运算器一次最多可以处理16位的数据
    2.寄存器的最大宽度为16位
    3.寄存器和运算器之间的通路是16位的
2.6 8086CPU给出物理地址的方法
1.8086有20位地址总线,可传送20位地址,实际上的寻址能力为1M
2.8086内部为16位结构,它只能传送16位的地址,理论上表现出的寻址能力却只有64K
3.问题:8086CPU如何用内部16位的数据转换成20位的地址?
    1.8086CPU采用一种在内部用两个16位地址合成的方法,来形成20位的物理地址
        即:段地址+偏移地址=物理地址
    2.地址加法器合成物理地址的方法:
        物理地址=段地址×16+偏移地址
    3.“地址段×16”即是数据左移4位(二进制位的左移4位,十六进制的左移1位)
        在地址加法器中,如何完成“段地址×16”?
        二进制形式的段地址左移4位
2.7 “段地址×16+偏移地址=物理地址”的本质含义
1.即可以用两个16位的二进制数来表示一个20位的二进制数
2.8086CPU中内部为16位结构,但地址线却是20位的,使用地址加法器可以把16位地址变成20位地址
    具体操作就是:段地址×16+偏移地址	    
2.8 段的概念
1.内存并没有分段,段的划分来自于CPU,由于8086CPU用“段地址×16+偏移地址=物理地址”
    的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存
2.以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,
    使用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元
3.注意
    1.段地址必然是16的倍数,即一个段的起始地址必然是16的倍数
    2.偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K
    3.CPU可以用不同的段地址和偏移地址形成同一个物理地址
2.9 段寄存器
1.段寄存器就是提供段地址的
    8086CPU有4个段寄存器:
    1.CS(code segment)
    2.DS(data segment)
    3.SS(stack segment)
    4.ES(extra segment)
2.当8086CPU要访问内存时,有这4个段寄存器提供内存单元的段地址
2.10 CS和IP

在这里插入图片描述

1.CS和IP时候8086CPU中最关键的寄存器
    他们指示了CPU当前读取指令的地址。
2.CS和IP的含义
    CS:代码段寄存器
    IP:指令指针寄存器【专用寄存器】
3.8086CPU工作过程的简要描述
    1.从CS:IP指向内存单元,读取指令,读取的指令进入指令缓冲器
    2.IP=IP+所读取指令的长度,从而指向下一条指令
    3.执行指令,转到步骤1,重复这个过程
4.开机时的CS和IP
    1.在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为
        CS=FFFFH,IP=0000H
    2.即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行
    3.FFFF0H单元中的指令是8086PC机开机后执行的第一条指令
5.修改CS、IP的指令
    1.在CPU中,程序员能够【用指令读写】的部件只有【寄存器】,
        程序员可以通过改变寄存器中的内容实现对CPU的控制
    2.CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容
        控制CPU执行目标指令
    3.如何修改CS和IP?
        1.通过mov改变AX等,但是不能通过mov改变CS和IP
        2.【jmp 段地址:偏移地址】  可以用来同时修改CS和IP
            指令中的段地址修改CS
            偏移地址修改IP
        3.【jmp 某一合法的寄存器】   仅修改IP的内容
            比如:jmp ax 或者 jmp bx(类似于mov IP ax)
        4.jmp是只具有一个操作对象的指令
2.11 代码段
1.可以将长度为N(N<=64KB)的一组代码,存放在一组地址连续、其实地址为16的倍数的内存单元中
    这段内存是用来存放代码的,从而定义了一个代码段
2.CPU中只认被CS:IP指向的内存单元中的内容为指令

【实验一】查看CPU和内存,用机器指令和汇编指令编程
1.R命令:查看、改变CPU寄存器的内容
r后面加寄存器的名称可以改变CPU寄存器的内容
2.D命令:查看内存中的内容
3.E命令:改写内存中的内容
4.U命令:将内存汇总的机器指令翻译成汇编指令
5.T命令:执行一条机器指令
6.A命令:以汇编指令的格式在内存中写入一条机器指令
1.debug中输入的默认是16位数
2.空格数量任意
7.按Q可以退出
配置好环境dosbox,把挂载debug32.exe所在文件夹。
输入r检查出现这些寄存器即可。

//脚本文件最后添加这3行即可 Assembly目录下要有debug.exe
mount c D:\Study\Assembly
c:
debug

alt+enter 全屏切换
输入r检查出现这些寄存器即可。
在这里插入图片描述

在这里插入图片描述

之前输入的两条指令用-u cs:ip查看
在这里插入图片描述
-a 继续往内存中输入指令,注意逗号哦~
在这里插入图片描述
-d cs:ip 直接查看内存中的ascii码 可以看到30代表0,31代表1
ffff0-fffff这个区域内会显示主板生产日期,这些信息刻录在主板的bios的rom中,是改写不了的
在这里插入图片描述
尝试用-e cs:ip 改写,查看还是原值
-e b810:0 01 01 02 02 03 03 04 04 是往显存中写数据,发现屏幕上出现了4个图案o(゚Д゚)っ!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值