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

    •操作数可以存在什么地方?

    操作数存在于指令代码中,处理器译码时就立即获得了这个操作数,这就是立即(数)寻址方式。汇编指令中,这个立即数(操作数)以常量形式出现 •操作数存在于处理器内部寄存器中,处理器从寄存器中获得这个操作数,这就是寄存器寻址方式。汇编指令中,这个寄存器操作数以寄存器名形式出现 •操作数存在于主存中,处理器从主存单元获得这个操作数,这就是存储器寻址方式。汇编指令中,这个存储器操作数以主存地址形式出现。

     

    •8086/8088处理器的主存地址在程序设计时采用逻辑地址。逻辑地址分成段地址和偏移地址两部分。

    存储器寻址方式表达存储器地址时,段地址在默认的或段超越前缀指令指定的段寄存器中,偏移地址被称为有效地址EA(Effective Address)。有效地址用中括号括起来。

     

    •有多种获得偏移地址的方法,所以存储器寻址方式又分成多种寻址方式。

    –有效地址直接给出,存在于指令代码中,就是直接寻址方式

    –有效地址存在寄存器中,就是通过寄存器的间接寻址方式

    –有效地址是两部分的和,一部分在寄存器中,另一部分直接给出(称为位移量),这就是寄存器相对寻址方式

    –有效地址是两部分的和,一部分在基址寄存器中(8086是BX和BP),另一部分在变址寄存器中(8086是SI和DI),      这就是基址变址寻址方式

    –有效地址是三部分的和,第一部分在基址寄存器中(8086是BX和BP),第二部分在变址寄存器中(8086是SI和DI),     第三部分直接给出(称为位移量),这就是相对基址变址寻址方式

     

    •区别各种寻址方式时,注意各自的特点:

    •只有一个常量,           立即(数)寻址方式;

    •只有一个寄存器名,      寄存器寻址方式;

    •其他                   则是存储器寻址方式。

    •用中括号括起一个常量        是直接寻址方式;

    •用中括号括起一个寄存器名,是寄存器间接寻址方式;

    •用中括号括起一个寄存器名和一个常量           是寄存器相对寻址方式; •用中括号括起两个寄存器名    基址变址寻址方式;

    •用中括号括起两个寄存器名和一个常量           是相对基址变址寻址方式。

     

    •汇编语句中,还有其他形式出现,需要理解相应操作符才能做出正确判断。

    例如

    •直接写出变量名实际上    是直接寻址方式;

    • 变量名加减一个常量    还是直接寻址方式;

    •变量名和一个寄存器     则是寄存器相对寻址方式;

    •利用offset后跟一个变量名             则是立即数寻址方式。

     

    •8086/8088有7种基本的寻址方式:

    立即寻址,

    寄存器寻址,

    直接寻址,

    寄存器间接寻址,

    寄存器相对寻址,

    基址加变址寻址方式,

    相对基址加变址寻址。

    •立即数寻址
    操作数就在指令中,作为指令的一部分,跟在操作码后存放在代码段。
    mov ah,01h
    mov ax,1204h 
    ;如果立即数是16位的,则高地址放在高位,低地址放在低位

    •寄存器寻址
    操作数在寄存器中,指令中指定寄存器号。对于8位操作数,寄存器可以是AL,AH,BL,BH,
    CL,CH,DL,DH。 对于16位操作数,寄存器可以是AX,BX,CX,DX,BP,SP,SI,DI等
    mov ah,ch
    mov bx,ax

    •直接寻址方式
    操作数在存储器中,指令直接包含操作数的有效地址EA。
    mov ax,[1122h] ;将ds:1122的数据放在ax,默认段为DS
    mov es:[1234],al ;采用了段前缀

    •寄存器间接寻址
    操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。在不采用段前
    缀的情况下, 对于DI,SI,BX默认段为DS,而BP为SS。
    mov ah,[bx]
    mov ah,cs:[bx] ;使用了段前缀

    •寄存器相对寻址
    操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的
    内容加上8位或16位的位移之和。在指令中的8位和16位的常量采用补码表示,8位要被带
    符号扩展为16位。
    mov ah,[bx+6]
    ;段址默认情况与寄存器间接寻址相同

    •基址加变址寻址
    操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)加上变址寄存器(SI,DI)的
    内容。如果有BP,则默认段址为SS,否则为DS.
    mov ah,[bx+si]

    •相对基址加变址寻址
    操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和变址寄存器(SI,DI)的
    内容加上8位或16位的位移之和。如果有BP,则默认段址为SS,否则为DS.
    mov ax,[bx+di-2]
    mov ax,1234h[bx][di]  *****************注意这两种不同的表达方法
    [注]:上面3~7为存储器寻址方式

     

    线面给出一张图片,个人认为结合图片在理解8086的寻址方式就会更简单:

    汇编的寻址方式

  • 相关阅读:
    Ansible工作架构和原理
    基于WSAAsyncSelect模型的两台计算机之间的通信
    基于Select模型通信程序的编写,编译和执行
    Windows API窗口绘图程序设计
    常用自动化运维工具
    简单的程序发布流程
    TCPIP协议编程:基于UDP协议的局域网聊天工具的研发
    Python 遗传算法实现字符串
    python3 井字棋 GUI
    Docker 容器的跨主机连接
  • 原文地址:https://www.cnblogs.com/JustDoFPGA/p/8412756.html
Copyright © 2011-2022 走看看