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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言中操作数寻址方式都有哪些,各自有啥特点,怎么区分呢?相关的知识,希望对你有一定的参考价值。

形成操作数的有效地址的方法,称为操作数的寻址方式。

  例如,一种单地址指令的结构如下所示,其中用X、I、D各字段组成该指令的操作数地址。  操作码OP  变址X  间址I   形式地址D

  指令中操作数字段的地址码是由形式地址和寻址方式特征位等组合形成,因此,一般来说,指令中所给出的地址码,并不是操作数的有效地址。因此,寻址过程就是把操作数的形式地址,变换为操作数的有效地址的过程。

一、隐含寻址

  在指令中不明显的给出而是隐含着操作数的地址。例如,单地址的指令格式,没有在地址字段中指明第

二操作数地址,而是规定累加寄存器AC作为第二操作数地址,AC对单地址指令格式来说是隐含地址。

二、立即寻址

  指令的地址字段指出的不是操作数的地址,而是操作数本身。这种方式的特点是指令执行时间很短,不需要访问内存取数。

   例如:单地址的移位指令格式为   OP(移位)   F   D

这里D不是地址,而是一个操作数。F为标志位,当F=1,操作数进行右移;当F=0时,操作数进行左移。

三、直接寻址

  直接寻址特点是:在指令格式的地址字段中直接指出操作数在内存的地址D。点击演示

  采用直接寻址方式时,指令字中的形式地址D就是操作数的有效地址E,既E=D。因此通常把形式地址。 点击演示

D又称为直接地址。此时,由寻址模式给予指示。 如果用S表示操作数,那么直接寻址的逻辑表达式为

S=(E)=(D)

四、间接寻址

  间接寻址的情况下,指令地址字段中的形式地址D不是操作数的真正地址,而是操作数地址的指示器,D单元的内容才是操作数的有效地址。

  如果把直接寻址和间接寻址结合起来,指令有如下形式: 操作码   I   D

  寻址特征位I=0,表示直接寻址,这时有效地址E=D;I=1,表示间接寻址,这时有效地址E=(D)。

  间接寻址方式是早期计算机中经常采用的方式,但由于两次访存,影响指令执行速度,现在已不大使用。

五、寄存器寻址方式和寄存器间接寻址方式

  当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。

   寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。

六、相对寻址方式

  相对寻址是把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。 点击演示

  采用相对寻址方式的好处是程序员无须用指令的绝对地址编程,所编程序可以放在内存任何地方。

  此时形式地址D通常称为偏移量,其值可正可负,相对于当前指令地址进行浮动。

七、基址寻址方式

基址寻址方式是将CPU中基址寄存器的内容加上指令格式中的形式地址而形成操作数的有效地址。点击演示

它的优点是可以扩大寻址能力。同形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。

八、变址寻址方式

  变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址。 但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律性变化。

九、块寻址方式

  块寻址方式经常用在输入输出指令中,以实现外存储器或外围设备同内存之间的数据块传送。块寻址方式在内存中还可用于数据块搬家。 块寻址时,通常在指令中指出数据块的起始地址(首地址)和数据块的长度(字数或字节数)。

  如果数据块是变长的,可用三种方法指出它的长度:

  (1)指令中划出字段指出长度;

  (2)指令格式中指出数据块的首地址与末地址;

  (3)由块结束字符指出数据块长度。  操作码  首地址  标志位  末地址

十、段寻址方式

  微型机中采用了段寻址方式,例如它们可以给定一个20位的地址,从而有1M存储空间的直接寻址能力。为此将整个1M空间存储器以64K为单位划分成若干段。在寻址一个内存具体单元时,由一个基地址再加上某些寄存器提供的16位偏移量来形成实际的20位物理地址。这个基地址就是CPU中的段寄存器。在形成20位物理地址时,段寄存器中的16位数会自动左移4位,然后以16位偏移量相加,即可形成所需的内存地址。

  这种寻址方式的实质还是基址寻址。 点击演示

参考资料:http://www.jju.edu.cn/jsj/download/jsjzc/lljx/4_3_2.html

参考技术A 又来一个懒虫,这些是ABC的知识,自己去找答案。本回答被提问者采纳 参考技术B 根据教育部考试中心颁布的全国计算机等级考试大纲,三级PC技术考试的基本要求有:熟悉80X86微处理器的结构、原理及其宏汇编语言程序设计。上机考试操作语言为:汇编语言。笔试考试内容之一——微处理器与汇编语言程序设计部分的重点是:80X86系列微处理器指令系统,指令格式与编码,寻址方式,指令系统。
从上可知汇编语言在三级PC技术考试中的重要性。熟悉并灵活地应用机器所采用的各种寻址方式,对汇编语言程序设计是至关重要的。指令系统常常要用到寻址方式,主要是要弄懂具体各条指令的源操作数和目的操作数放在什么地方,也就是操作数的寻址方式。在具体应用编程时,如果弄不懂寻址方式就无法下手。可以说寻址方式是学习汇编这门低级语言的入场券,但寻址方式往往也是学习过程中的瓶颈问题。
下面和大家谈谈如何掌握80X86系列微处理器(以Intel8086/8088为例)的寻址方式。
在学习Intel8086/8088微处理器中寻址方式时,涉及的寻址概念有七个:寄存器寻址、立即寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址。其中寄存器寻址、立即寻址、直接寻址相对来说好理解,而寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址这四种寻址方式之间有许多密切联系之处,极其容易混淆。如何找出它们之间的区别和联系,从而形成正确的概念呢?
我们知道,分析、比较与综合是思维的基本过程,也是重要的逻辑思维方法。根据汇编抽象的特点,在进行概念学习时,借助比较的方法提高我们的辨析能力,最后综合应用所学到的概念来编程解决实际问题。
下面应用比较分析法来谈谈这七种寻址方式的学习,并结合三级PC技术的考题以帮助大家理解。
一、寄存器寻址
指令所指明的寄存器就是操作数的存放地址。
汇编格式:R (R是寄存器名)
功能:寄存器R的内容是操作数。
对寄存器寻址方式,我们要牢牢掌握操作数存放在指令规定的寄存器中,不需访问内存,工作效率高。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP;而对8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。
例1. MOV AX, BX
执行过程如下图所示:
分析:源操作数BX和目的操作数AX都是寄存器寻址。
执行前:(AX)=8A9DH (BX)=1234H
执 行:(BX)→AX
执行后:(AX)=1234H (BX)=1234H
由于寄存器是CPU的一部分,因此采用寄存器寻址方式可以提高工作效率。特别是累加器AX,若用它存放运算结果,则指令的执行时间要短些。对于那些需要经常存取的操作数,采用寄存器寻址方式较为合适。
二、立即寻址
在立即寻址方式中,立即操作数可以是8位或16位,并且是指令的一部分。立即数据总是紧跟在指令操作码之后并和操作码一起存放在代码段中,因而立即数据总是和操作码一起被放入BIU中的指令队列里,在指令执行时不需再存取存储器。
汇编格式:n (n为立即操作数)
功能:指令下一单元的内容为操作数n。
立即寻址的寻址方式如图所示:
对立即寻址方式,我们可和寄存器寻址比较学习。首先这两种寻址方式都不需要访问内存,这是它们之间的共同点,其次,立即寻址的操作数就在代码段里的操作码之后,是指令的一部分,而寄存器寻址的操作数则放在指令规定的寄存器中。
例:2003年4月考题
根据下面定义的数据段:
DSEG SEGMENT
DAT1 DB ‘1234‘
DAT2 DW 5678H
ADDR EQU DAT2-DAT1
DSEG ENDS
执行MOV AX,ADDR指令后,AX寄存器中的内容是:
(A)5678H (B)7856H
(C)4444H (D)0004H
答案:D

三级中pc技术是最难的 不过任何考试都有其对招.我建议你做如下准备: 1.了解本考试所要考内容,对其有一定的了解,知道其究竟要你去做什么,你需要掌握些什么 2.去书店选购一本辅导书以及真题,真题是必须做的,同时还要机试题,也可以从网上下 3.针对本次大纲以及辅导书上的内容去选择一本比较全面的教材,然后先看教材,对其有一个基本了解,弥补自己对本门知识的不足 4.然后看辅导书,这样你可以抓住考试要点,最后真题演练 最后我要说的是pc技术难度较高,希望你能静下心来好好学习
参考技术C 用”汇编语言中操作数寻址方式”在百度里一搜就出来了

汇编寻址方式记录

x86/amd64汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/Visual C++GNU/Gas采用(Gas也可使用Intel汇编风格):

项目 Intel风格 AT&T风格
操作数顺序 目标操作数在前 源操作数在前
寄存器 原样 加%前缀
立即数 原样 加$前缀
16进制立即数 用后缀B与H分别表示二进制与十六进制 对于16进制字母开头的要加前缀0 加前缀0x
访问内存长度的表示 前缀BYTE PTR, WORD PTR, DWORD PTR和QWORD PTR表示字节,字,双字和四字 后缀b,w,l,q表示字节,字,双字和四字
引用全局或静态变量var的值 [var] var
引用全局或静态变量var的地址 var $var
引用局部变量 需要基于栈指针(rsp)
绝对寻址 [imm] imm
间接寻址 [reg] (%reg)
基址相对寻址 [reg +imm] imm(%reg)
变址寻址 [base+index] (base,index)
变址寻址 imm[base+index] imm(base,index)
比例变址寻址 imm[base + index * scale ] imm(base, index, scale)
scale只能是1,2,4,8其中的一个数字(1省略不写就是普通变址寻址)
代码注释 单行注释用;+注释内容。例如:mov rax, rdx ;这里是注释
注意 这里imm为立即数,base和index为寄存器,scale为伸缩量

以上是关于汇编语言中操作数寻址方式都有哪些,各自有啥特点,怎么区分呢?的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言之寻址方式

目前国内比较流行的Linux发行版本都有哪些?这些发行版本有啥各自的特点?

微型的操作系统都有哪些各有啥特点?

汇编语言指令都有哪些?

大数据分析工具都有哪些,有啥特点?

8086/8088的指令都有哪些寻址方式