第二章 寄存器
cpu内部由运算器,控制器,寄存器等器件构成,这些器件靠内部总线相连
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线链接各种器件,在他们之间进行数据的传送
2.1 通用寄存器
- 通用寄存器:AX,BX,CX,DX
- 8086CPU的所有寄存器都是16位的,可以存放2个字节
- 8086的上一代CPU的寄存器都是8位的,为了保证兼容,16位的寄存器可以分为两个可独立使用的8位寄存器来使用,比如AX分为AH(高8位)AL(低8位)
2.2 字在寄存器中的存储
- 字节,记为Byte,一个字节由8bit组成
- 字:记为word,一个字由两个字节组成
- 一个16进制的数可以代表4个bit,通常使用两个16进制的数代表一个字节,用16进制表示的数据后面加H
2.3 几条汇编指令
汇编代码不区分大小写,指令的俩那个操作对象的位数应当是一致的,如果使用add
指令得到的值超过了寄存器的大小,将舍弃高位
mov ax,18
:将18送入ax(ax=18)add ax,bx
:ax的值+bx(ax+=bx)
2.1 检测点
- 写出每条汇编指令执行后相关寄存器中的值
mov ax,62627
AX=(F4A3H) 解析mov ah,31H
AX=(31A3H)mov al,23H
AX=(3123H)add ax,ax
AX=(6246H)mov bx,826CH
BX=(826CH)mov cx,ax
CX=(6246H)mov ax,bx
AX=(826CH)add ax,bx
AX=(04D8H)mov al,bh
AX=(0482H)mov ah,bl
AX=(6C82)add ah,ah
AX=(D882)add al,6
AX=(D888)add al,al
AX=(D810)mov ax,cx
AX=(6246H)
- 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方
- mov ax,2
- add ax,ax
- add ax,ax
- add ax,ax
2.4 物理地址
- 这里的物理地址是指逻辑内存空间内的内存地址
2.5 16位结构CPU
16位结构CPU代表一次能处理16位的数据,现在的机器一般都是64位的
- 运算器一次最多可以处理16位数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
2.6 8089CPU给出物理地址的方法
- 使用两个16位地址合成一个20位的地址
- 这两个地址称为段地址和偏移地址
- 物理地址 = 段地址*16 + 偏移地址
2.7 “段地址*16+偏移地址=物理地址”的本质含义
- CPU访问内存单元是,用一个基础地址(段地址*16)和一个相对与基地址的偏移地址相加
- 为什么段地址要*16?
- 地址是16进制表示的,乘16就相当于10进制的数据乘10,后面加个零
- 因为要访问的内存地址是20位的,用16进制表示其最大的数为
F FF FF
,但16位的CPU能代表的最大的数为FF FF
,两个FF FF
相加并不能覆盖掉所有的内存地址,所以段地址要*16,才能覆盖掉所有的内存地址
2.8 段的概念
内存是连续的不是分段的,地址用段地址+基地址表示只是为了管理内存
偏移地址为16位,最大寻址能力位64kb,所以一个段的长度最大为64kb
2.2 检测点答案
- 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为(10H)到(1000FH)
- 有一数据存放在内存20000H单元中,现给定段地址SA,若想用偏移地址寻到此单元,则SA应满足的条件是:最小为(1001H),最大为(2000H)
2.9 段寄存器
CS,DS,SS,ES
2.10CS和IP
在8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
- CS段地址寄存器
- IP指令指针寄存器
2.11修改CS、IP的指令
在8086不能使用mov直接修改CS和IP的值,可以使用这个指令jmp 寄存器|FFFF:FFFF
2.3检测点
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:四次- 第一条指令执行后,IP指向第二条指令
- 第二条执行执行后,IP指向第三条
- 第三条指令执行后,IP指向连续的下一个内存地址(指令并不是立马执行,而是放入指令缓存区)
- 第三条指令执行
实验1 查看CPU和内存,用机器指令和汇编指令编程
指令可选参数使用
[]
包裹,也就是说在使用指令时不用加此参数也可以
二选一参数使用|
分割,参数二选一
- 安装window安装教程
- 使用
r [寄存器]
:查看,改变CPU寄存器的内容,这里可以直接修改CS和ip,输入寄存器后回车
,就可以修改寄存器的内容了d [[段地址:]基地址]
:查看内存中的内容e [[段地址:]基地址]
:改写内存中的内容,输入地址后按回车
,使用空格
跳转到下一个内存单元,使用回车
结束修改u [[段地址:]基地址]
:将机器指令翻译成汇编指令t
:执行一条CS:IP
指向的指令a [[段地址:]基地址]
:以汇编指令的格式在内存中写入一条机器指令,使用回车
继续编写,如果无内容直接回车
退出编辑