微机原理之期中突击
WOC,明天期中,今晚不调车了,突击一波。。。
1、8086体系结构中寄存器的认识
存在14个16位
的寄存器和8个8位
寄存器
通用寄存器:传送、暂存数据和接受相关的运算结果。
16位数据寄存器,保存操作数和操作结果,缩短了访问内存的时间和并且不会占用相关的系统总数。
AX(累加器、被除数的低16位和除法结果) = AH + AL(8位)<两个独立的寄存器,下面的相同>
BX(基址寄存器) = BH + BL(8位)<用于基址寻址,唯一一个作为存储器指针使用的寄存器>
CX(字符串操作、控制循环次数) = CH + CL (移位的时候使用,保存移位的位数)(8位)
DX(32位乘除法,存放被除数的高16位,或者保留余数,AX保留结果) = DH + DL(8位)
8个八位寄存器
AH 、AL 、BH、 BL、 CH、 CL、 DH、 DL
指针寄存器:存储某个存储单元的地址或者是一段存储单元的起始地址
16位指针寄存器
BP(基址指针 base point 堆栈数据区基址的偏移 )
SP(堆栈指针 stack pointer
<push pop 指令的时候使用,保存栈顶地址>
) (上面两个指针一般是和SS合用)
16位变值寄存器<一般在字符串操作的时候用的比较多>
DI (目的地址 destination )
SI(源地址 source) (上面的两个寄存器一般是和DS、ES合用)
控制寄存器
- IP(指令指针)<下一条指令的地址,但是不代表是下次将会执行的指令>
- 在计算机的组成原理中还有PC**(程序计数器,始终指向下一条将要执行的指令,有时候PC和IP的内容相同,有时候又不同,个人理解?)**
FLAG(标志寄存器),其中包含了9个标志,主要反映存储器的状态和相关的运算状态。(前6个运算结果标志,后3个控制标志)
结果标志
- 0 CF (carry flag ) 进位标志 反映运算是否产生进位或者借位<加法和减法>
- 2 PF (parity flag ) 奇偶标志 反映运算结果中1的个数是奇数还是偶数(偶数则置为1)
- 4 AF(assist flag ) 辅助标志 在字节操作中,发生低半字节向高半字节进位或借位;在字操作中,低半字向高半字进位或者借位
- 6 ZF(zero flag ) 零标志 反映运算结果是否为0
- 7 SF(signed flag )符号标志 反映运算结果的符号位,与运算结果的最高位相同
- 11 OF(over flag) 溢出标志 反映有符号数加减运算是否引起溢出
控制标志
- 8 TF(trace flag ) 跟踪标志 置为1后,cpu进入单步方式。主要用于调试,cpu执行一条指令后被中断
9 IF(interrupt flag)中断标志 决定CPU是否相应外部可屏蔽中断请求,1则响应,0则不响应
10 DF(direction flag) 方向标志决定串操作指令执行时有关指针寄存器调整方向,为1,则串操作指令按减方式改变有关寄存器的值,反之则用加方式
2、地址分段和寻址
明确地址分段的原因
- 因为在8086中CPU的地址线是
20位
,那么实际可用的最大物理地址空间是1MB
,但是因为寄存器都是只有16位和8位
之分,最大寻址范围是64KB
,为了寻找到所有的物理地址,需要对物理地址空间进行分段。 - 分段一般是由
段首地址+段内偏移地址
组成。 - 对于段的首地址不是随意乱取,通常都以“小段的起始地址为主”
- “小段”即是在物理地址中从
00000H
开始,每16个字节
而划分的,那么整个物理地址空间就可以划分为64K个小段
,且首地址的最后四位均为0(用二进制表示时),所以是16的倍数
。 - 进行分段后,段与段之间就会有重叠、相邻、不会相干的现象产生。
物理地址= 段首地址*16+段内偏移地址
,或者段首地址*10H + 段内偏移地址
- 前者为物理地址,后者段首地址:偏移地址为逻辑地址。所以一个物理地址可能对应多个逻辑地址的表示。
3、寻址方式
汇编代码是由两部分组成:操作码+操作数
- 一般操作码在相应的机器指令体系中有相关的表示,但是操作数的存储就会不同了。
操作数存储在如下地方:
直接在汇编代码中:那么这种寻址方式就是立即数寻址 mov ax, 1234H
存放在寄存器中:那么这种寻址方式就是寄存器寻址 mov ax,bx
存放在内存中,那么这种寻址方式就比较多了
寻址方式:(以源操作数的寻址为例)
- 1、立即数寻址
mov ax,1234H
- 2、寄存器寻址
mov ax,bx
- 3、直接寻址
mov ax,【1234H】 (ax) = (ds*16+1234H)
- 4、寄存器间接寻址
mov ax,【bx】 (ax) = (ds*16+bx)
mov ax,【BP】 (ax) = (ss*16+bp)
因为bp的默认是通过ss
来寻址,不过也可以通过段地址前缀来进行强加了
mov ax,ds:[BP] (ax) = (ds*16+bp)
- 5、寄存器相对寻址
mov ax,[bx+1234H] (ax) = (ds*16+bx+1234H)
也可以表示为
mov ax,1234H【bx】
.同4,也存在这样的关系
6、基址变址寻址
mov ax,【bx+si】 (ax)= (ds*16+bx+si) <bx是基址寄存器,默认是和ds合用>
也可以表示为mov ax,【bx】【si】或者是mov ax,【si】【bx】
7、相对基址变址寻址
mov ax,【bx+si+1234H】 (ax)=(ds*16+bx+si+1234H)
3、指令系统
- 如果需要在两个存储单元中进行数据传送,可以利用一个寄存器过渡
MOV AX,VARW1
然后MOV VARW2,AX
,实现了VARW1->VARW2
的数据传送。 - 立即数是不能直接送段寄存器的,立即数必须先送达一个普通的寄存器,然后再送到段寄存器。
IO的地址有16位,即64K个地址。 64K个地址中如果是小于255也就是8位地址可以直接送,但是如果大于8位需要用一个DX来传送!
以A~F打头的数字出现在指令中时,前面必须加数字0。以免与其它符号相混淆(如:0AF22H)
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/79955285
- 点赞
- 收藏
- 关注作者
评论(0)