feng - 云代码空间
——
在cpu中
运算器进行信息的处理
寄存器进行信息的存储
控制器控制各种器件进行工作
内部总线连接各种器件,在他们之间进行数据的传送
对于汇编程序员来说,cpu中的主要部件是寄存器,寄存器是cpu中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对cpu的控制
8086cpu有14个寄存器,每个寄存器都有一个名称。这些寄存器是:ax,bx,cx,dx,si,di,sp,bp,ip,cs,ss,ds,es,psw.
通用寄存器
8086cpu所有寄存器都是16位的,可以存放两个字节,ax bx cx dx 这4个寄存器通常用来存放一般性的数据,称为通用寄存器
那么一个16为寄存器可以存储的数据的最大值是多少呢?65535
由于8086上一代的寄存器都是8位的,为了保证兼容性,8086cpu的ax bx cx dx这4个寄存器都可以分为两个独立使用的8为寄存器来使用
ax 分为 ah(高八位) al(低八位)
bx 分为 bh bl
。。。。。。。
一个8位寄存器所能存储的最大数据位?255
字在存储器中的存储
处于对兼容性的考虑 8086cpu可以一次性处理以下两种尺寸的数据
字节(8位) 和 字(16位)
十六进制数的一位相当于二进制数的4位 ,如0100111000100000 可表示成4(0100) E(1110) 2(0010) 0(0000)四个十六位进制数
几条汇编指令
mov ax,18 将18送入寄存器ax ax=18
mov ah,78 将78送入寄存器ah ah=78
add ax,8 将寄存器ax中的数值加上8 ax=ax+8
mov ax,bx ..........................
add ax,bx ...........................
如题(H 表示是16进制数)
one:
ax=8226H bx=8226H
add ax ,bx
ax=? bx=?
分析:
16进制加法 逢16进一
ax=ax+bx=8226+8226=1044CH 由于ax为16位寄存器,只能存4位十六进制数据,因此最高位1不能保存在ax中,ax=044CH;bx=8226H;
two:
ax=00c5H
add al,93H
ax=?
分析
al 中的数据=C5 al=C5+93=158H 由于al为8位寄存器,只能存放两位16进制的数据,最高位的1丢失
ax中的数据为:0058H(这里的丢失不是真的丢弃这个进位值,后续解释)
注意:此时的al是作为一个独立的8位寄存器来使用,和ah没有任何关系。在进行数据传送或运算时,要注意指令的两个操作对象的位数应当一致的。
例如:
mov ax ,bl (错误的,在8位和十六位寄存器之间传送数据)
用目前学过的汇编指令,最多4条指令,编程计算2的4次方?
mov ax,2 //ax=2
add ax,ax //ax=2+2
add ax,ax //ax=4+4
add ax,ax //ax=8+8
物理地址
我们知道,cpu访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个空间有唯一的地址,我们称这个唯一的地址叫物理地址!
cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址。在cpu向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。如何形成内存单元的物理地址呢?
16位结构的cpu
什么是16位结构的cpu呢?
概括的讲,16位结构表现为
运算器一次可以最多处理16位的数据
寄存器的最大宽度为16位
寄存器和运算器之间的通路为16位
8086是十六位结构的cpu,也就是说在8086内部,能够一次性处理,传输,暂时存储的信息的最大长度是16位的。
8086cpu有20位地址总线,可以传送20位地址。达到1mb寻址能力。8086cpu又是16结构的,因此8086cpu采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
cpu要读写内存时
1 cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
2 段地址和偏移地址通过内部总线送入一个叫地址加法器的部件
3 合成20位地址
4 将20位地址送入输入输出控制电路;
5 再送入地址总线
6 在送入存储器
地址加法器采用 物理地址=段地址*16+偏移地址 (一个X进制的数据左移一位,相当于乘以X)
内存单元地址小结
cpu可以用不同的段地址和偏移地址形成一个物理地址
偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可以巡64kb个内存单元
比如给定段地址 1000H,用偏移地址寻址,cpu寻址范围为:10000H~1FFFFH
数据在21f60H内存单元中的讲法为 数据存在内存2000:1f60单元中
题:
1 给定段地址为0001H,仅通过变化偏移地址寻址,cpu寻址范围为?到?
分析:偏移地址16位,变化范围为0~FFFFH 所以 answer:00010H到1000FH
2 有一个数据存放在20000H单元中,现给定段地址为sa,若想用偏移地址寻址到此单元,则sa得满足最大?最小?
分析: 单偏移地址为0时,sa最大 为2000H ,单偏移地址最大,sa最小 为FFFF+sa*16=20000 sa=1001H answer :sa最大 为2000H sa最小为sa=1001H
段寄存器
是什么部件提供段地址?8086有4个段寄存器:cs ds ss es;由这四个提供!这里看cs
cs和ip
cs和ip是8086中最关键的两个寄存器,他们指示了cpu单前要读取指令的地址!!!!cs为代码段寄存器,ip为指令指针寄存器
在8086中,任意时刻 如果cs内容为M ip内容为n 则cpu将从内存m*16+n中读取指令并执行
现在,如果提出一个问题:cpu根据什么将内存中的信息看作指令?cpu将cs:ip指向的内存单元中的内容看做指令,任何时候,cpu将cs ip中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令!
8086cpu工作过程:
1 从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲器
2 ip指向下一条指令
3 执行指令。(转到1 重复这个过程)
查看cpu和内存!用机器指令和汇编指令编程
预备知识:debug的使用
r命令查看,改变cpu寄存器的内容(r || r cs 回车 改变的值 )
d命令查看内存中的内容(d || d 1000:0 查看内存10000H处的内容 之后接着按d可查看后续内容 | |
d 1000:0 9 查看1000:0到1000:9的内存内容)
e改写内存中的内容 (e 1000:0 从内存地址10000H处开始改写内存内容 回车结束改写)
u将内存中的机器指令翻译成汇编指令 (u 1000:0 查看该处的汇编指令)
t 执行一条机器指令 (可先用r来改写csip 在用t来一步一步执行指令)
a 以汇编指令的格式写机器指令(a 以汇编的形式写入指令,e是以机器指令写)
pc机主板上的rom中写有一个生产日期,在内存fff00H~fffffH的某处,请找到并试图修改它!!
分析:打开debug 输入 d fff0:0 发现没有 在输入d fff0:0080 还是没有 在输入d fff0:00e0 此时我们发现出现了日期的身影 04/27/05 所处的位置在 fff0:00f5 到fff0:00fc 此时我们用e fff0:00f5开始改写 完后再用d来查看 发现并没有改变。因此我们认为此处是只读的!!