• 汇编基础知识之一


    1:进制的简单介绍

      

      二进制表示的数据后面加B,

      十进制表示的数据后面什么也不加,

      16进制表示的数据后面加H,

      2个16进制可以表示一个字节(这是因为一个字节占8位,2进制一个符号占1位,16进制一个符号占4位,所以2个16进制可以表示一个8位)

    例如:10进制20000,   16进制:4E20H,  二进制: 0100 1110 0010 0000B

    cmd里面输入calc打开计算器,可以进行换算

    2:PC中各类存储器的逻辑连接

    3:cpu寄存器

    寄存器是在CPU内部中的,相当于cpu中的一个临时存储的空间。

    8086 cpu有14个寄存器(8个通用寄存器),且均为 16 位 ,名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.

    AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器。

    通用寄存器:

    AX,BX,CX,DX 称作为数据寄存器:

    AX (Accumulator):累加寄存器,也称之为累加器;

    BX (Base):基地址寄存器;

    CX (Count):计数器寄存器;

    DX (Data):数据寄存器;

    SP 和 BP 又称作为指针寄存器:

    SP (Stack Pointer):堆栈指针寄存器;

    BP (Base Pointer):基指针寄存器;

    SI 和 DI 又称作为变址寄存器:

    SI (Source Index):源变址寄存器;

    DI (Destination Index):目的变址寄存器;

    控制寄存器:

    IP (Instruction Pointer):指令指针寄存器;

    FLAG:标志寄存器;

    段寄存器:

    CS (Code Segment):代码段寄存器;

    DS (Data Segment):数据段寄存器;

    SS (Stack Segment):堆栈段寄存器;

    ES (Extra Segment):附加段寄存器;

    8086 cpu所有的寄存器都是16位的,可以存放2个字节。一个字可以存在16位寄存器中,word(字)=2B,字是16位(H)为单位的,

    以AX通用寄存器为例:

     数据:18

    二进制表示:10010

    在寄存器AX中的存储:

     ***

     一个16位寄存器所能存储的数据最大值是(2^16)-1

    最小值是0,最大值是2^16-1=65535,可以表示的总数据有2^16=65536

    例如1,2,3,4,5共5个数,总个数=max-min+1   ----> max=总个数+min-1

    1=2的0次方
    10=2的1次方
    100=2的2次方
    .
    1 0000 0000 0000 0000=2的16次方
       1111 1111 1111 1111就是2的16次方减一.

    4:

    8086上一代cpu的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为2个独立的8位寄存器使用

    AX可以分为AH,AL;

    BX可以分为BH,BL;

    CX可以分为CH,CL;

    DX可以分为DH,DL;

    8086 CPU的8位寄存器存储逻辑

    以AX为例,8086cpu的16位寄存器分为2个8位寄存器的情况:

    前面AH的8位都是0,只用后面AL 8位;

    AX的低8位(0--7)构成了AL寄存器,高8位(8-15位)构成了AH寄存器;AH和AL都是可以独立使用的8位寄存器。

    例如:

    5:    16位结构的CPU特点:

      (1):运算器一次最多可以处理16位的数据

      (2):寄存器的最大宽度为16位。

      (3):寄存器和运算器之间的通路是16位的

       8086的CPU外部有20位地址总线,传递20位地址,寻址能力为1M(2^20=1MB)

       8086内部16位地址总线,只能传送16位地址,寻址能力有64KB(2^16=64KB)

    8086采用一种在内部用2个16位的地址合成的方法形成一个20位的物理地址

     

    6:地址加法器物理地址=段地址*16+偏移地址   

      偏移地址和段地址都是16位,2^16范围:0~~FFFFH的内存单元

        一个数据的二进制形式左移一位,相当于此数据乘2,左移N位,相当数据乘2的N次方

        一个数据的10进制形式左移一位,相当于此数据乘10

        一个数据的16进制形式左移一位,相当于此数据乘16

        地址加法器对段地址*16的操作是:以二进制形式存放的段地址左移4位,16进制的话左移一位

      偏移地址位16位,16位地址的寻址能力为64K(2^16=64KB),所以一个数据段的长度最大为64K

     内存单元地址小结:

      (1)cpu访问内存单位时,必须向内存提供内存单元的物理地址

      (2)8086cpu在内部用段地址和偏移地址相加的方法形成最后 的物理地址

        

        结论:cpu可以不同的段地址和偏移地址形成同一个物理地址

      

      思考:如果给定一个段地址,仅仅通过变化偏移地址来寻址,最多可以定位多少内存单元?

        结论:偏移地址16位,变化范围是0~~FFFFH,仅用偏移地址寻址的话最多寻址64K个内存单元

      例如:给段地址1000H,用偏移地址寻址,cpu的寻址范围是:

         10000H~~1FFFFH

      (3)在8086cpu中,存储单元的地址用2个元素来描述:段地址和偏移地址

        

    段(数据段)是随便定义的(前提是:地址连续,起始地址为16的倍数的一组内存单元定义为一个数据段,专门存储数据的内存空间)

    比如:123B0H~123B9H ,是一个数据段,段地址为123BH,长度为10个字节

    7: 段寄存器

      段寄存器就是提供段地址的,8086cpu有4个人段寄存器:CS(代码地址),DS(数据地址),SS(堆栈地址),ES

      当8086cpu要访问内存时,由于这4个段寄存器提供内存单元的段地址

      CS和IP是8086cpu的最关键的寄存器,他们指示了cpu当前要读取指令的地址

      CS (cpu内部的代码段寄存器),CS里面的内容当做指令的段地址

      IP(cpu内部的指令指针寄存器),IP里面的内容当做指令的偏移地址

     

    8086cpu的工作过程:

    (1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器

    (2)从IP=IP+所读取指令的长度,从而指向下一条指令

    (3)执行指令,转到(1),重复

    8:8086pc工作过程简述:

      在8086cpu加电启动或者复位后(即cpu刚开始工作),CS和IP被设置为CS=FFFFH,IP=0000H;

      即是8086pc机刚启动时,cpu从内存FFFF0H单元读取指令执行,

      FFFF0H单元的指令是8086pc开机执行的第一条指令。

       在任何时候,cpu将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址。到内存中读取指令码,执行。

    9:  8086cpu提供转移指令修改CS,IP的内容

    jmp 段地址:偏移地址

    计算方法是段地址要左移一位,因为cpu内的地址设是16位的,要访问20位的地址总线要采用移位(2进制移4位,16进制移1位,就是乘以16的方法),

    比如地址xxAB:XXCD代表XAB0+XXCD--->XABCD(一共20位地址)

    例如: jmp 2AE3:3    --->  2AE30+0003=2AE33H

    jmp:3:0B16    ---> 00030+0B16=B46H

     

    (1) mov ax,6622

    (2) jmp 1000:3

    (3)mov ax,0000

    (4)mov bx,ax

    (5)jmp bx

    (6)mov ax,0123H

    (7)转到第3步执行

    这是一个死循环

    10: 代码段

      对于8086pc机,可以根据需要将一个内存单元定义为一个段

      可以将长度为N(N<=64KB,偏移地址不能超过16位,也就是一个段的索引不能超过2^16=64KB,也就是一个段最大存放64KB)的一组代码,

      存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存存放代码,从而定义为代码段

    小结:

    (1)8086cpu要访问内存时,由段寄存器提供内存单元的段地址,8086cpu有4个段寄存器其中CS用来存放指令的段地址

    (2) CS存放指令的段地址,IP存放指令的偏移的地址

    (3)8086机器,任意时刻,cpu将CS:IP指向的内容当做指令执行。

    11:

  • 相关阅读:
    java 获取未知枚举的集合(get unknown enum list)
    解析Disruptor:写入ring buffer
    解析Disruptor:拼接依赖
    Python3.x在linux下print中文问题
    Python3源码方式编译
    正则表达式学习
    PHP传值和传引用、传地址的区别
    php中关于sizeof()函数
    [原]JointJS流程图
    [原]OpeanLayers3 For ArcGIS MapServer
  • 原文地址:https://www.cnblogs.com/DonAndy/p/6067587.html
Copyright © 2020-2023  润新知