汇编-寻址方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编-寻址方式相关的知识,希望对你有一定的参考价值。

《微型计算机原理与接口技术(第2版)》冯博琴 吴宁 主编-清华大学出版社——做笔记用

在书P96页 3.2.1 指令的执行时间 中提到:

   “在3.1.1小节中讨论的三种类型的操作数中,寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢。这是由于寄存器 位于CPU的内部,执行寄存器操作数指令时,8086的执行单元(EU)可以快捷地从CPU内部的寄存器中取得操作数,不需要访问内存,因此执行速度很 快。 立即数操作数作为指令的一部分,在取指时被8086总线接口单元(BIU)取出后,存放在BIU的指令队列中,执行指令时也不需要访问内存,因而执行速度 也比较快。而存储器操作数存放在内存单元中,为了取得作数,首先要由总线接口单元计算出其所在单元的20位物理地址,然后在执行存储器的读写操作。所以相 对前述两种操作数来说,指令的执行速度最慢。”

  1、立即寻址

    MOV   AX,3102H  表示将16位的立即数3102H送入累加器AX,执行后,AH = 31H, AL = 02H

      源操作数是一个立即数,作为指令的一部分,紧跟在指令的操作码之后,存放于内存的代码段中。在CPU取指令还是随指令码一起取出并直接参加运算。

      这里的立即数可以使8位或16位的整数。若为16位,则存放时,低8位存放于低地址单元,高8位存放于高地址单元。

      立即寻址方式主要用于给寄存器或存储单元赋初值。

  2、直接寻址

    MOV  AX,[3102H]  表示将数据段中偏移地址为3102H和3103H两单元的内容送到AX中。【地址是16位的,但内容只有8位,8086的16位寄存器就那14个】

    MOV  BL,ES:[1200H] 表示将ES段中偏移地址为1200H单元的内容送到BL寄存器中。

    MOV  BL,ES:[BUFFER]  表示用BUFFER代替偏移地址,但BUFFER必须在程序的开始处予以定义,第4章中介绍。

      参加运算的数据存放在内存中,存放的地址由指令给出。即指令中的操作数是存储器操作数,[ ]内用16位常数表示存放数据的偏移地址。

      数据的段基地址默认为数据段,可以允许段重设。

  3、寄存器寻址

    MOV  SI,AX     表示将AX的内容送到寄存器SI中,而指令执行后AX中的内容保持不变

      在寄存器寻址方式下,指令的操作数为CPU的内部寄存器。

  4、寄存器间接寻址

    MOV  AX,[SI]    表示目的地址寄存器SI中的内容作为偏移地址+默认的数据段寄存器DS中的内容作为段基址,将此地址下寄存器中的内容送到AX。

    MOV  AX,ES:[SI]    表示重设了ES段为段基址。

    MOV  BX,BP    若用基址指针寄存器,则默认段基址在堆栈段,段基址寄存器默认为SS。

      用寄存器的内容表示操作数的偏移地址,在此方式下,存放操作数偏移地址的寄存器只允许时SI、DI、BX和BP,统简称为“间址寄存器”或“地址指针”

      选择不同的间址寄存器,设计的段寄存器不同:

间址寄存器 默认段 可重设
SI DS  可
DI DS  可
BX DS  可
BP SS  可

    但无论选择哪一个间址寄存器,都允许段可重设,可在指令中用段重设符指明当前操作数在哪一个段。【与表2-3的相关性】

  5、寄存器相对寻址

    MOV  AX,DATA[BX]  带有一个位移量DATA。  

      eg:设DS = 6000H, BX = 1000H, DATA = 0008H; 则 操作数所在的物理地址 = 600000H+1000H+0008H = 61008H

      操作数在内存中的存放地址(偏移地址)由间址寄存器的内容加上指令中给出的一个8位或16位的位移量。

      操作数所在段由所使用的间址寄存器决定(规则与寄存器间接寻址方式相同)。

      因位移量可看做相对值,故把这种带位移量的寄存器间接寻址方式称为寄存器相对寻址。

      寄存器相对寻址常用于存取表格或一维数组中的元素。把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(反过来也可以),位移量是从零开始的。

      汇编语言中,相对寻址指令的书写格式允许有几种不同的形式:

      MOV  AL,DATA[SI]

      MOV  AL,[SI]DATA

      MOV  AL,DATA+[SI]

      MOV  AL,[SI]+DATA

      MOV  AL,[DATA+SI]

      MOV  AL,[SI+DATA]

  6、基址—变址寻址

    MOV  AX,[BX][SI]  表示BX+SI作为偏移地址,默认DS作段基址,找到相应地址中的内容送到AX中。

      由一个基址寄存器(BX或BP)的内容和一个变址寄存器(SI或DI)的内容相加而形成操作数的偏移地址,即所谓的“基址—变址”。

      默认情况下,指令中若用BX作基址寄存器,则段地址在DS中;若用BP作基址寄存器,段地址在SS中。但允许段重设。

      ***不允许两个基址寄存器或两个变址寄存器组合在一起用于基址—变址寻址。***

  7、基址—变址—相对寻址

    MOV  AX,DATA[DI][BX]  表示在基址—变址的方式下多加一个DATA位移量

      使用这种寻址方式可以很方便地访问二维数组。用基址寄存器存放数组的首地址(偏移地址),而变址寄存器和位移量分别存放行和列的值。

      与寄存器间接寻址方式类似,也有多种表示方式。

      ***与基址—变址寻址方式类似,不允许两个基址寄存器或两个变址寄存器组合在一起用于此寻址方式。***

  8、隐含寻址

    MUL  BL  表示把AL中的内容与BL中的内容相乘,乘积送到AX寄存器。这条指令隐含了被乘数AL以及乘积AX。

      在有些指令的操作码中,不仅包含了操作的性质,还隐含了部分操作数的地址。

      如:乘法指令MUL,在这条指令中只须指明乘数的地址,而被乘数以及乘积的地址是隐含且固定的。

以上是关于汇编-寻址方式的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言中操作数寻址方式都有哪些,各自有啥特点,怎么区分呢?

汇编语言(第3版)王爽试验7 寻址方式在接过话数据访问中的应用(代码+注释)

汇编语言之寻址方式

汇编学习笔记-80x86寻址方式

16位汇编 --寻址方式

《Linux内核 核心知识全解析(完)》