汇编学习笔记(5)-8086/8066架构

  • 8086/8088CPU功能结构

    • 20根地址总线,可直接寻址的内存为1MB,2^20B,8088的数据总线有8根,8086的数据总线有16根,但字节均为16位
    • 执行单元EU由8个16位的通用寄存器,1个16位的标志寄存器,16位的算术逻辑单元,及EU控制电路组成
    • EU的功能是执行指令。EU从指令队列取出指令代码,并在ALU中进行计算,运算结果的特征保存在标志寄存器FL中
  • 8086/8066的内部寄存器

    • 共有14个16位寄存器,可分为8个通用寄存器,4个段寄存器,2个控制寄存器

      • 通用寄存器

        • 可以在许多指令中用于存放参与操作的数据或存放操作结果,包括数据寄存器,变址寄存器,地址寄存器

          • 数据寄存器AX,BX,CX,DX

            • 16位寄存器,可将高低8位分别作为两个独立的8位寄存器使用,高8位为H,低8位为L
            • 一般作为通用寄存器使用,但又有各自的习惯用法
              • AX(Accumulator),称为累加器,在乘除法运算,串运算,IO指令中作为专用寄存器
              • BX(Base),基址寄存器,在计算机寻址时,用来存放基地址
              • CX(Count),计数寄存器,在循环和串操作中用作计数器
              • DX(Data),数据寄存器,在寄存器间接寻址的IO指令中存放IO端口地址,在做双字节乘除法运算时,DX与AX合起来存放一个双字长数据(32位),DX存放高16位
          • 变址寄存器 SI DI

            • SI(source Index)源变址寄存器
            • DI(Destination)称为目的变址寄存器,除用于算术逻辑运算之外,还常用于寻址
          • 指针寄存器SP BP

            • 通常与堆栈段寄存器SS配合起来构成远指针(即既包含段地址又包含偏移地址的指针)指向堆栈空间中的数据
            • SP(Stack Pointer)堆栈指针寄存器,与SS(堆栈段寄存器)构成SS:SP指向堆栈顶端
            • BP除了用于算术逻辑运算外,和SS配合构成SS:BP指向堆栈中的数据,包括函数的参数,局部动态变量,函数的返回值
          • 段寄存器 CS SS DS ES

            • CS(Code Segment)代码段寄存器,存放代码段的段地址
            • SS(Stack Segment) 堆栈段寄存器,存放堆栈段的段地址
            • DS(Data segment),数据段寄存器,用来存放数据段的段地址
            • ES(Extra Segment),附加数据段寄存器,存放附加数据段的段地址
            • CS和IP规定下条指令的段地址与偏移地址,SS与SP分别规定堆栈顶端的段地址与偏移地址
          • 控制寄存器 IP,FL

            • IP(Instruction Pointer)指令指针寄存器,用来存放代码段中的偏移地址。CS与IP始终指向下一条指令的首字节,CS等于段地址,IP为偏移地址,这一地址送到存储器后,控制器可以取得下一条指令,一旦取得指令,马上修改IP的内容,指向下一条指令,用户程序不能直接访问IP,而只能通过jmp,call,ret来间接改变IP

            • FL(Flags),标志寄存器,16位寄存器,但只用其中9位,包括6个状态标志和3个控制标志,状态标志用来记录程序运行结果的状态信息,他们的值是计算机在执行运算后按一定规则设定的,不是1就是0

              • 1514131211109876543210
                OFDFIFTFSFZFAFPFCF
              • OF(Overflow Flag)溢出标志:如运算结果超出了机器能表示的范围,称为溢出,此时OF=1,做加法运算时,若两个正数相加为负数,或负数相加为正数就是溢出,一正一负永不溢出,减法可以看成加法

                • 相关指令为JO,JNO
                • JO表示OF=1跳转
                • JNO表示OF=0跳转
                • 当把操作数看成符号数,OF才需要关心,非符号数运算不需要关心
              • SF(Sign Flag)符号标志,记录运算结果的符号,负1正0,JS与JNS,JS(SF=1跳),仅对符号数有意义

              • ZF(Zero Flag)零标志,结果为0,ZF=1,JZ(JE),JNZ(JNE)

                • JZ,JE表示ZF=1跳转
                • JNZ与JNE表示ZF=0跳转
              • CF(Carry Flag)进位标志,记录最高位向左边产生的进位值或者借位值,最高位向左边有进位或借位,CF=1,否则为0

                • 相关指令,JC,JNC,CLC,STC,CMC
                  • JC,CF=1跳转
                  • JNC,CF=0跳
                  • CLC,使CF=0
                  • STC,使CF=1
                  • CMC,使CF反转
                • 仅对非符号数有意义
              • AF(Auxiliary Carry Flag)赋值进位标志,记录运算时第三位向左边产生的进位值或借位值,(类似CF)

              • PF(Parity Flag)奇偶标志,用来为串行传送时可能产生的错误提供检验条件,当低8位1的个数位偶数,PF=1,否则PF=0

                • 相关指令
                  • JP,JPE,PF=1跳
                  • JNP,JPO,PF=0跳
              • mov指令对标志位没有影响

              • DF(Direction Flag)方向标志:在字符串处理指令中控制处理信息的方向,DF=1时,每次操作后使SI和DI减量,这样使串处理从高地址向低地址方向进行,当DF=0时,则使SI和DI增量,使串处理从低地址向高地址方向进行

                • 相关指令
                  • CLD,使DF=0
                  • STD,使DF=1
              • IF(Interrupt Flag)中断标志,当IF=1时,允许外部硬件中断,否则,禁止外部硬件中断,与IF相关的指令是CLI与STI,类似

              • TF(Trace Flag)跟踪标志:用于程序调试时使CPU进入单步工作状态,当TF=1时,每条指令执行完产生一个int 01h中断,允许调试器在每条指令执行后输出调试信息,TF=0时,CPU正常工作不产生int 01h中断

  • 8086/8088的内存组织

    • 至少以1字节为单位访问数据,地址从0开始编号,顺序地每隔一个单元加上1,

    • 数据物理地址
      FFh00000h
      10H00001h
      90hFFFF9h
      1AhFFFFAh
      10hFFFFFh
    • 数据的存放

      • 按照低位字节存入低地址的存储单元,高位字节存入高地址的存储单元的原则,信息的存入次序和书写次序是相反的比如说7B86H,先存入86H,再存入7BH,一个双字数据9C68E563H在存储时,以此存入63,e5,68,9cH,字和双字单元的地址都是采用它的低位字节存储单元的地址表示,一个地址可能对应字,字节,双字,可以通过byte ptr,word ptr,dword ptr修饰变量来确定操作数是字节,字,双字

寻址方式

  • 立即数,常数

  • 寄存器

  • 直接寻址

  • 间接寻址

    • 偏移地址中含有基址寄存器(BX,BP)或变址寄存器(SI,DI)

    • 一般形式

      • 基址寄存器+变址寄存器+偏移量
        BX或BPSI或DI8位或16位符号数
      • [bx+位移]这种寻址方式的缺省段地址位DS

      • 基本格式

        • 寄存器必须用方括号括起来,若位移在寄存器之后且不带方括号必须在前面使用加号
      • [bp+位移]缺省段地址位SS

      • 缺省段地址与偏移地址中使用的寄存器有关,如果含有BP,则规定是SS,如果不含,则为DS

  • 指令系统

    • 数据传送指令
      • 通用数据传送指令mov,push,pop,xchg
        • mov dest,src
          • 效果:dest=src
          • 格式:
            • mov reg,idata;reg寄存器,idata立即数
            • mov mem.idata;mem表示内存变量
            • mov reg,reg
            • mov reg,mem
            • mov mem,reg
          • mov指令不影响任何标志位,mov指令的操作数不能全为内存变量,不能把立即数赋值给段寄存器,不能对CS进行赋值,不能把一个段寄存器赋值给另一个段寄存器,mov指令的操作数必须宽度一致,不能用mov访问IP和Fl
        • push op
          • 效果:把操作数op压入堆栈,sp=sp-2,word ptr ss:[sp]=op,把ss:sp指向的字赋值为op
          • 格式:
            • push reg;必须为16位
            • push mem;同上
          • push不影响任何标志位,操作数不能是8位
        • pop op
          • 效果:从堆栈中弹出一个数到op中,op=word ptr ss:[sp],sp+=2
          • 格式:同上
          • pop不影响标志位,操作数不能是8位,不能为cs
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值