第二章 寄存器
一个典型的CPU由运算器,控制器 ,寄存器等器件构成。
在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在它们之间进行数据的传送。
程序员通过改变各种寄存器中的内容来实现对CPU的控制。
2.1 通用寄存器
8086CPU的寄存器都是16位的,通用寄存器:AX,BX,CX,DX
为了兼容上一代CPU:
AX可分为AH和AL
BX可分为BH和BL
CX可分为CH和CL
DX可分为DH和DL
2.2 字在寄存器中的存储
字节:byte,一个字节由8bit组成。
字:word,一个字由两个字节组成,高字节和低字节。例如20000存储在AX中就可以看成AH为78,AL为32
2.3 几条汇编指令
在编写时,不区分大小写,例:mov ax,18 和MoV AX,18含义相同。
问题2.1中:最后add ax,bx 执行后 ax应该为8226H+8226H(H为16进制)等于1044CH。但是AX为16位寄存器所以多出了一位不能保存,最后AX为044CH。
问题2.2中 :最后add al,93H 执行后al=C5H+93H=158H ,al作为独立的8位寄存器所以也要丢失高位1,最终ax为0085H。
两个题总结就是:注意寄存器进行的是16位运算还是8位运算。
检测点2.1 (一定要做检测点,加深记忆,说不定做题中就学到新知识了。)
mov ax,62627 | ax = F4A3 |
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 = 04DBH |
mov al,bh | ax = 0482H |
mov ah,bl | ax = 6C82H |
add ah,ah | ax = D882H |
add al,6 | ax = D888H |
add al,al | ax = D810H |
mov ax,cx | ax = 6246H |
2.4 物理地址
所有的内存单元构成的储存空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,称为物理地址。
2.5 16位结构的CPU
2.6 8086CPU给出的物理地址的方法
8086CPU有20位地址总线,可以传送20位地址,达到1M寻址能力。在内部一次处理、传送、暂时存储的地址为16位。
地址加法器采用 物理地址 = 段地址 + 偏移地址
例如1230 与 00C8 加法器做1230H*16(10进制)=12300H(这里乘法看不懂的可以推广到10进制的乘10上去验证) 12300H+00C8H=123C8H
2.7 “段地址*16+偏移地址=物理地址”的本质含义
本质含义:CPU在访存时,用一个基础地址(段地址*16和一个相对于基础地址的偏移地址相加。书上给了两个例子理解,我的理解就是在限制条件下(4位16进制)下更好的增加寻址能力(有误,且喷)。
2.8 段的概念
书上写了两页,为了说明段的概念,我感觉其实就是逻辑上地址上的一个区分而已(有误,且喷)。
2.9 段寄存器
8086CPU段寄存器:CS,DS,SS,ES。提供内存访问时的段地址
2.10 CS和IP
CS段寄存器,IP指令寄指针存器 CS和IP可以指向读取指令的起始位置,因为计算机存储的都是二进制0和1,就是为了计算机能自己区分哪里是数据哪里是指令。
比如CS设置为2000H,IP设置为0000H,那么计算机就从内存20000H开始把二进制01当作指令执行。执行后IP加上上一个指令的大小。继续执行下一条指令。
2.11 修改CS、IP的指令
程序员可以通过修改CS、IP控制执行目标指令。mov指令(称为传送指令)可以修改大部分寄存器的值(ax,bx,,cx,dx)但是不能设置CS和IP的值(8086CPU搞得鬼)。但是8086CPU提供了转移指令:jmp。用法:”jmp 段地址:偏移地址“ 作用:修改CS 和IP。“jmp 某一合法寄存器 ” 作用:用寄存器的值修改IP。
问题2.3 挺简单的就不写了 最后死循环。
2.12 代码段
检测点2.3 第一次ip指向mov指令,第二次指向sub指令,第三次指向jmp,第四次指向ax=0.
实验一
首先需要在win10安装dsbug,自行百度搜索win10安装debug。
debug命令:
R:查看、修改CPU寄存器的内容
D:查看内存的内容
E:修改内存内容(可以是数据、指令)
U:将内存的内容解释为机器指令和对应的汇编指令
T:执行CS:IP指向的指令
A:以汇编指令的形式向内存写入指令
用R指令查看:
用R指令修改:
用D命令查看内存(d 段地址:偏移地址)也可以在后面添加范围(d 段地址:偏移地址1 偏移地址2) :
用E命令修改内存内容 (e 起始地址 数据 数据 数据......)数字,字符都可以:
也可以e 起始地址 回车后 写一个 按空格 再写一个
用E命令写机器码:
例如:
b80100 | mov ax,0001 |
b90200 | mov cx,0002 |
01c8 | add ax,c x |
为了执行上面的指令首先得修改CS IP指向1000:0
然后用t执行观察ip ax cx:
用A指令写汇编指令(写完后两次回车):
实验二
1.用E命令写(这写的要命啊生怕出错):
2.用A命令写(也好不到哪去哈哈,还是高级语言写着快):
(2)2的8次放(我做的时候在8+8的时候为啥没出来16想半天,才记起是16进制 害!)
(3)查看pc上rom的生产日期,修改不了因为是rom。
(4)修改不了,1.15写了:地址0~7FFFH的32KB为主随机存储器的地址空间
地址8000H~9FFFH为显存地址空间
地址A000H~FFFFH为各个ROM的地址空间
完!