CPU概述:一个典型的CPU由运算器,控制器,寄存器等器件组成,这些器件靠内部总线相连
    8086CPU有14个寄存器,他们的名称为:AX.BX.CX,DX.SI.DI.SP.BP.IP.CS.SS.DS.ES.PSW
    通用寄存器:8086cpu所有的寄存器都是16位的,可以存放两个字节。
    AX.BX.CX.DX通常用来存放一般性数据,被称为通用寄存器。
    AX通用寄存器的逻辑结构image.png
    image.png
    8086上一代cpu寄存器都是8位,为保证兼容性,这四个通用寄存器都可以分为两个独立八位寄存器,如,AX可以分为AH(high)AL(low),同理BX….且优先使用低寄存器

    字在寄存器中的存储
    一个字节为八位一个字为两个字节
    image.png
    物理地址
    CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的地址成为物理地址。
    十六位结构的cpu
    概括的,16位结构描述了一个cpu具有一下几个方面特征:
    1.运算器一次最多可以处理16位的数据,
    2.寄存器的最大宽度位十六位
    3.寄存器和运算机之间的通路是十六位的
    8086CPU鬼畜物理地址的方法:
    8086有二十位的地址总线,可传送20位地址,寻址能力位1M
    8086内部为十六位结构,它只能传送十六位的地址,表现出的寻址能力却只有64k
    image.png
    8086CPU读写内存时,1,CPU中的相关部件提供一个十六位的地址,一个成为段地址,一个称为偏移地址。2.段地址和偏移地址通过内部总线传送入一个称为地址加法器的部件3.地址加法器将两个十六位地址合并成一个20位的地址。
    物理地址=段地址16+偏移地址
    image.png
    *段的概念

    image.png
    段寄存器:
    段寄存器就是提供段地址的,8086cpu有四个段寄存器:CS.DS.SS.ES
    CS和IP:
    CS和IP是8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址,其中,CS为代码段寄存器,IP为指令段寄存器
    修改CS.IP的指令
    在CPU中,程序员才能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是有CS.IP中的内容决定的,程序员可以通过改变CS。IP中的内容来控制CPU执行目标指令。
    mov指令不能修改CS,IP的值,可以通过转移指令jmp 段地址,偏移地址进行修改如image.png
    仅修改IP内容:jmp 某一合法寄存器,如:
    jmp ax(类似于 mov IP,ax)
    jmp bx
    如果想要200h这个偏移地址写进ax中并跳转,则mov ax,200h
    jmp ax
    代码段:1.对于8086pc机,在编程时,可以根据需要,将一度内存单元定义为一个段。2.可以将长度为N(N<=64kb)的一组代码存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段,image.png
    如何执行代码段:将CS.IP只想代码段第一条指令的首地址
    汇编指令长度与寻址方式有关,规律或原则如下:
    一、没有操作数的指令,指令长度为1个字节
    二、操作数只涉及寄存器的的指令,指令长度为2个字节
    如:mov bx,ax
    三、操作数涉及内存地址的指令,指令长度为3个字节
    如:mov ax,ds:[bx+si+idata]
    四、操作数涉及立即数的指令,指令长度为:寄存器类型+1
    8位寄存器,寄存器类型=1,如:mov al,8;指令长度为2个字节
    16位寄存器,寄存器类型=2,如:mov ax,8;指令长度为3个字节
    五、跳转指令,分为2种情况:
    1、段内跳转(指令长度为2个字节或3个字节)
    jmp指令本身占1个字节
    段内短转移,8位位移量占一个字节,加上jmp指令一个字节,整条指令占2个字节
    如:jmp short opr
    段内近转移,16位位移量占两个字节,加上jmp指令一个字节,整条指令占3个字节
    如:jmp near ptr opr
    2、段间跳转,指令长度为5个字节
    如:jmp dword ptr table[bx][di]
    jmp far ptr opr
    jmp dword ptr opr
    注意:形如“jmp 1234:5678”的汇编指令,是在Debug中使用的汇编指令,汇编编译器并不认识,如果在源程序中使用,那么在编译时便会报错。