zoukankan      html  css  js  c++  java
  • 汇编的寻址方式

    内存寻址在指令中可以表示成如下的通用格式:

      ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)

    它所表示的地址可以这样计算出来:

      FINAL ADDRESS = ADDRESS_OR_OFFSET + BASE_OR_OFFSET + MULTIPLIER * INDEX

      其中ADDRESS_OR_OFFSET和MULTIPLIER必须是常数,BASE_OR_OFFSET和INDEX必须是寄存器。在有些寻址方式中会省略这4项中的某些项,相当于这些项是0




    以下是寻址的几种方式:

      直接寻址(Direct Addressing Mode)。只使用ADDRESS_OR_OFFSET寻址,例如movl ADDRESS, %eax把ADDRESS地址处的32位数传送到eax寄存器。
     

      变址寻址(Indexed Addressing Mode) 。上一节的movl data_items(,%edi,4), %eax就属于这种寻址方式,用于访问数组元素比较方便。
     

      间接寻址(Indirect Addressing Mode)。只使用BASE_OR_OFFSET寻址,例如movl (%eax), %ebx,把eax寄存器的值看作地址,把这个地址处的32位数传送到ebx寄存器。注意和movl %eax, %ebx区分开。
     

      基址寻址(Base Pointer Addressing Mode)。只使用ADDRESS_OR_OFFSET和BASE_OR_OFFSET寻址,例如movl 4(%eax), %ebx,用于访问结构体成员比较方便,例如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内的偏移量是4字节,要把这个成员读上来就可以用这条指令。
     

      立即数寻址(Immediate Mode)。就是指令中有一个操作数是立即数,例如movl $12,%eax中的$12,这其实跟寻址没什么关系,但也算作一种寻址方式。
     

      寄存器寻址(Register Addressing Mode)。就是指令中有一个操作数是寄存器,例如movl $12, %eax中的%eax,这跟内存寻址没什么关系,但也算作一种寻址方式。在汇编程序中寄存器用助记符来表示,在机器指令中则要用几个Bit表示寄存器的编号,这几个Bit也可以看作寄存器的地址,但是和内存地址不在一个地址空间。
     
    物理地址=段地址×16+偏移地址的本质意义 

      地址加法器采用物理地址=段地址×16+偏移地址的方法来用段地址和偏移地址来合成物理地址。

      本质意义:CPU在访问内存的时候,用一个基础地址和一个相对于基础地址的偏移地址相加,给出内存地址的物理空间。更一般的说,这种寻址方式是一种具体的实现方案,段地址×16就被看作基础地址。

      例子:我们要读取10000H单元的内容,可执行下面的程序:  

      mov bx,1000H  
      mov cs,bx  //8086CPU不支持直接将数据加入cs段寄存器中
      mov al,[0]  //[0]表示cs:ip格式的1000H:0内存单元中的内容

  • 相关阅读:
    树形DP
    区间DP
    洛谷P1462 通往奥格瑞玛的道路
    缓存--Redis
    Flack--SQLAlchemy
    Flask--WTForms
    Flask框架
    通过反射,获取linkedHashMap的最后一个键值对。对map按照值进行排序。
    Comparable和Comparator的使用
    构造函数,构造代码块,静态函数的执行顺序
  • 原文地址:https://www.cnblogs.com/bugY/p/2216459.html
Copyright © 2011-2022 走看看