微机原理之期中突击

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值