间接寻址及寄存器指令
- 格式:pdf
- 大小:5.19 MB
- 文档页数:23
详解西门子间接寻址【址概念】完整一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中操作数是指令要执行目标,也就是指令要进行操作址。
我们知道,PLC中划有各种用途存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,说来指定确切大小。
当然定时器T、计数器C不存这种衡量体制,它们仅用位来衡量。
由此我们可以到,要描述一个址,至少应该包含两个要素:1、存储区域2、这个区域中具体位置比如:A Q2.0其中A是指令符,Q2.0是A操作数,也就是址。
这个址由两部分组成:Q:指是映像输出区2.0:就是这个映像输出区第二个字节第0位。
由此,我们出,一个确切址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0。
DB X 200 . 0其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:址标识符。
这样,一个确切址组成,又可以写成:址标识符 + 确切数值单元【间接寻址概念】寻址,就是指定指令要进行操作址。
给定指令操作址方法,就是寻址方法。
谈间接寻址之前,我们简单了解一下直接寻址。
所谓直接寻址,简单说,就是直接给出指令确切操作数,象上面所说,A Q2.0,就是直接寻址,A这个指令来说,Q2.0就是它要进行操作址。
这样看来,间接寻址就是间接给出指令确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号 [ ] 标明内容,间接指明了指令要进行址,这两个语句中MD100和DBW100称为指针Pointer,它指向它们其中包含数值,才是指令真正要执行址区域确切位置。
间接由此名。
西门子间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
【存储器间接寻址】存储器间接寻址址给定格式是:址标识符+指针。
汇编语⾔--操作数的寻址⽅式(三)三、操作数的寻址⽅式操作数是指令或程序的主要处理对象。
如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不可能有数据处理功能。
在CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,⼤量的指令在执⾏过程中都会涉及到操作数。
所以,在指令中如何表达操作数或操作数所在位置就是正确运⽤汇编指令的⼀个重要因素。
在指令中,指定操作数或操作数存放位置的⽅法称为寻址⽅式。
操作数的各种寻址⽅式是⽤汇编语⾔进⾏程序设计的基础,也是本课程学习的重点之⼀。
微机系统有七种基本的寻址⽅式:⽴即寻址⽅式、寄存器寻址⽅式、直接寻址⽅式、寄存器间接寻址⽅式、寄存器相对寻址⽅式、基址加变址寻址⽅式、相对基址加变址寻址⽅式等。
其中,后五种寻址⽅式是确定内存单元有效地址的五种不同的计算⽅法,⽤它们可⽅便地实现对数组元素的访问。
另外,在32位微机系统中,为了扩⼤对存储单元的寻址能⼒,增加了⼀种新的寻址⽅式——32位地址的寻址⽅式。
为了表达⽅便,我们⽤符号“(X)”表⽰X的值,如:(AX)表⽰寄存器AX的值。
1、⽴即寻址⽅式操作数作为指令的⼀部分⽽直接写在指令中,这种操作数称为⽴即数,这种寻址⽅式也就称为⽴即数寻址⽅式。
⽴即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果⽴即数为16位或32位,那么,它将按“⾼⾼低低”的原则进⾏存储。
例如:MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV W1, 3456H ADD D1, 32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第⼆操作数都是⽴即数,在汇编语⾔中,规定:⽴即数不能作为指令中的第⼆操作数。
该规定与⾼级语⾔中“赋值语句的左边不能是常量”的规定相⼀致。
⽴即数寻址⽅式通常⽤于对通⽤寄存器或内存单元赋初值。
图3.1是指令“MOV AX, 4576H”存储形式和执⾏⽰意图。
8086中的七种寻址⽅式寻址⽅式8086/8088有七种基本的寻址⽅式:⽴即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址。
其中,后五种寻址⽅式(即直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址)属于存储器寻址,⽤于说明操作数或操作数地址所在存储单元的地址。
这五种⽅式也就是确定存放操作数的存储单元有效地址EA的⽅法,这⾥所说的有效地址就是在前⾯⼀节讲存储器分段中所说的段内偏移地址。
除了这些基本的寻址⽅式以外,还有固定寻址和I/O端⼝寻址等,但不会在本节中介绍到。
基本寻址⽅式下⾯重点说⼀下这七种基本寻址⽅式的特点:1. ⽴即寻址⽅式先解释⼀个概念,叫做⽴即数。
操作数包含在指令中,它作为指令的⼀部分,跟在操作码后存放在代码段。
这种操作数称为⽴即数。
⽴即寻址⽅式所提供的操作数紧跟在操作码后⾯,与操作码⼀起放在指令代码段中,不需要到其他地址单元中去取。
⽴即数可以是8位,也可以是16位。
这种寻址⽅式主要⽤于给寄存器或存储单元赋初值的场合。
⽴即寻址⽅式是这七种寻址⽅式中速度最快的寻址⽅式。
举例:MOV AX, 1234H ; 给AX寄存器赋值为1234H2. 寄存器寻址⽅式寄存器寻址的特点是操作数在CPU内部的寄存器中,在指令中指定寄存器号。
对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI和SP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。
例如:MOV SI, AXMOV AL, DH由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采⽤寄存器寻址⽅式的指令执⾏速度较快。
3. 直接寻址⽅式直接寻址的操作数在存储器中,指令直接包含有操作数的有效地址。
由于操作数⼀般存放在数据段,所以操作数的地址由DS加上指令中给出的16位偏移得到。
假如DS内容是5000H,地址为51234H字存储单元中的内容时6789H,那么在执⾏“MOV AX, [1234H]”后寄存器AX的内容是6789H。
七种寻址方式一、立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
例如:MOV AH,80H ADD AX,1234H MOV ECX,123456HMOV B1,12H MOV W1,3456H ADD D1,32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
二、寄存器寻址方式指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。
把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式如:ADD VARD,EAX ADD VARW,AX MOV VARB,BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
在第4章将会学到如何定义它们。
2、目的操作数是寄存器寻址方式如:ADD BH,78h ADD AX,1234h MOV EBX,12345678H等。
3、源和目的操作数都是寄存器寻址方式如:MOV EAX,EBX MOV AX,BX MOV DH,BL等。
三、直接寻址方式指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
【计算机组成原理】指令系统-寻址⼀、指令和数据的寻址⽅式操作数或指令在存储器中的地址:某个操作数或某条指令存放在某个存储单元时其存储单元的编号在存储器中,操作数或指令字写⼊或读出的⽅式,有地址指定⽅式、相联存储⽅式和堆栈存取⽅式。
寻找⽅式:当采⽤地址指定⽅式时,形成操作数或指令地址的⽅式。
寻址⽅式分为两类:指令寻址和数据寻址。
1)指令寻址:确定下⼀条预执⾏指令的指令地址a、顺序寻址:(PC)+1->PC 程序计数器⾃动加1b、跳跃寻址:由转移指令指出2)数据寻址:确定本条指令的操作数地址指令中所给出的地址码,并不⼀定是操作数的有效地址。
寻址过程就是把操作数的形式地址,变换为操作数的有效地址。
例如:⼀种单地址指令的结构如下所⽰,其中⽤X I D各字段组成该指令的操作数地址。
⼆、寻址⽅式1、隐含寻址(操作数在累加寄存器中)在指令中不明显的给出⽽是隐含着操作数的地址例如:单地址的指令格式,没有在地址字段指明第⼆操作数地址,⽽是规定累加寄存器AL或AX作为第⼆操作数地址,AL或AX对单地址指令格式来说是隐含地址eg: MOV AL ,LSRC_BYTEMUL RSRC_BYTEADD寻址特征A操作数地址隐含在操作码中,(寻址特征指明寻址类型)。
另⼀个操作数隐含在ACC中先在内存中地址为A的地⽅找到⼀个操作数,另⼀个操作数隐含在寄存器ACC⾥,从ACC⾥取出另外⼀个操作数,然后和给出的A 地址中的数相加暂存在ACC中。
2、⽴即寻址形式地址A就是操作数本⾝OP⽴即寻址特性 #A指令执⾏阶段不访存A的位数限制了⽴即数的范围3、直接寻址EA=A直接根据读内存找到操作数,形式地址不需要经过任何处理。
执⾏阶段访问⼀次存储器A的位数决定了该指令操作数的寻址范围MOV AX,[2222H]:将有效地址为2222H的内存单元的内容读到累加器AX中4、间接寻址EA=(A)有效地址由形式地址间接提供,形式地址是操作数的地址的地址OP间接寻址标识 A根据A的内容到内存中寻找到的是操作的数地址,再根据这个地址去找操作数。
8051单片机指令系统的7种寻址方式解析寻址方式:寻址就是寻找操作数的地址。
绝大多数指令执行时都需要操作数,因此就存在如何确定操作数地址的问题。
所谓寻址方式就是通过什么途径获取操作数的方式。
根据指令操作的需要,计算机总是提供多种寻址方式。
一般来说,寻址方式越多计算机的寻址能力就越强,但指令系统也就越复杂。
8051指令系统有7种寻址方式:寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,基址寄存器加变址寄存器间接寻址,相对寻址,位寻址,下面分别介绍。
寄存器寻址寄存器寻址:寄存器寻址就是操作数在寄存器中,因此指定了寄存器就得到了操作数。
采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器。
例如:MOV A R1 这条指令的功能是把工作寄存器R1的内容传送到累加器A中,由于操作数在R1中,因此指令中指定了R1,也就得到了操作数。
寄存器寻址方式的寻址范围包括:工作寄存器组R0~R7,部分特殊寄存器ACC,B,DPTR 等。
直接寻址直接寻址:直接寻址就是在指令中直接给出操作数所在单元的真实地址。
这里给出的操作数直接地址为8位二进制地址。
程序中一般用十六进制数表示。
例如:指令MOV A,30H 把内部RAM单元30H中的数据传送给累加器A,指令中30H就是操作数的直接地址。
直接寻址方式的寻址范围包括:内部数据存储器低128单元,特殊功能寄存器。
特殊功能寄存器在指令的表示中除了可以以直接地址形式给出外,还可以以寄存器符号形式给出,如对累加器A,在指令中可使用其直接地址OEOH,也可使用其符号形式ACC。
立即寻址立即寻址:立即寻址方式就是实际操作数作为指令的一部分,在指令中直接给出,取指令时,可在程序存储器中直接取得操作数。
通常把出现在指令中的操作数称为立即数。
采用立即寻址方式的指令,在立即数前面加上。
内容页码STEP 7 中可能的寻址方式 (2)变量直接寻址 (3)DB中地址标识符直接寻址 (4)在程序中分析DB信息 (5)存储器间接寻址 (6)用于存储器间接寻址的指针结构 (7)存储器间接寻址的特性 (8)间接寻址示例 (9)练习4.1:用间接寻址的方法进行循环编程 (10)内部区域,寄存器间接寻址 (11)交叉区域,寄存器间接寻址 (12)用于装载地址寄存器的指令 (13)其它用于地址寄存器的指令 (14)寄存器间接寻址的特性 (15)练习4.2:用寄存器间接寻址的方法进行循环编程 (16)POINTER类型和ANY类型数据的块参数 (17)POINTER类型的结构和参数赋值 (18)ANY数据类型的结构 (19)ANY数据类型参数赋值 (20)ANY (21)参数类型间接赋值评估ANY型指针传递 (22)练习4.3:用于求和及计算平均值的功能 (23)直接寻址使用直接寻址,存储单元地址可以直接包含在指令中,也就是说,地址标识符指明了指令所要处理数值的地址。
了指令所要处理数值的地址符号寻址在控制程序中,可以进行绝对地址寻址(比如:I 1.0)或进行符号地址寻址(比如“开始信号”)。
符号地址是使用名称来代替绝对地址。
使用有意义的名称使程序的可读性增强。
不过,在使用符号寻址时,要注意区分局部符号(在块的声明部分)和全局符号(符号表)。
间接寻址使用间接寻址,可以寻址那些只有在程序运行时才确定其地址的地址标识符。
例如,通过间接寻址,可以对程序的一些部分进行反复扫描(循环编程),由此,每次扫描所用到的地址被赋予不同的地址数值。
次扫描所用到的地址被赋予不同的地址数值关于间接寻址,要注意区分以下两种情况:•存储器间接寻址:寻址的地址指针位于用户储存器存储单元里(比如MD30)。
使用存储器间接寻址,也可以为位于保存寻址地址标识符指针的存储器中的变量赋予符号化名称。
•寄存器间接寻址:在访问之前,要将指向寻址地址的指针装载到其中一个S7处理器地址寄存器(AR1或AR2)中去。
警告用于使用间接寻址时,只有在程序运行期间才计算地址,所以,就会有这样的潜在的危险性,即存储器被意外覆盖,进而导致PLC的意外动作。
变量的直接寻址使用直接寻址方法,可以对那些基本类型变量进行寻址,其中所谓的基本变量是指其长度最多不超过4个字节。
简单变量由下面几个部分组成:个字节简单变量由下面几个部分组成•一个变量标识符(比如:“IB”,表示输入字节)•存储区内一个确切的地址(存储单元位置)(字节地址或位地址),它由地址标识符所确定。
地址或者简单变量也可以通过全局、符号名(符号表)来进行寻址。
外围设备与S5不同的是,访问外围设备的时,必须要区分是输入还是输出。
但是,仍然只能只读(L PIW)访问外设输入,只写访问(T PQW)外设输出。
本地数据使用STEP 7,也可以绝对访问本地数据堆栈,例如:• A L 12.6 (扫描地址为12.6的本地数据位捕捉信号状态= 1)•L LW 12(将本地数据字装载到ACCU1中)DBX/DIX也可以在数据块内直接访问简单变量:• A DBX 12.6 (扫描地址为12.6的本地数据位捕捉信号状态= 1数据块DB必须预先打开)。
•L DB5.DBW10(将DW10装载到DB5中)复杂变量可以访问那些具有复杂数据类型(诸如结构或数组等)的局部变量。
对复杂变量来说,只能对其组成部分进行绝对访问,这是因为其组成部分为基本数据类型。
概述CPU将两个数据块寄存器用于处理数据地址,当前打开的数据块号就存储在这些寄存器中存器中。
访问数据块之前,首先必须用这两个数据块寄存器中的一个将其打开。
可以使用如下指令来打开数据块:•OPN DBx或OPN DIx或者借助于数据块地址标识符组合寻址来打开,比如:•L DBx.DBWy(但没有L DIx.DIWy这种形式!)在这种情况下,数据块DB号x也被装入DB寄存器中。
寻址在STEP7中,数据块是一个字节一个字节地组织起来的,所以,为了对BIT(位)、BYTE(字节)、WORD(字)或DWORD (双字)长度的数据进行直接地址访问,每种情况都要给出字节地址。
符号访问为了进行符号访问,需要在符号列表里输入数据块的符号名。
您可以使用DB Editor (数据编辑器)来为数据块的各个变量分配符号名。
现在可使用指令L “Values”..Number_1实现对数据元素的完全符号访问。
该操作将打开DB19(其中“Values”为DB 19的符号名)并装载DBW 2(其中Number_1为_DBW2符号名)。
DB, DI寄存器这两个寄存器里包含了当前打开的数据块的有效数据块号。
在一级调用中,可以同时打开两个数据块。
时打开两个数据块在STL编程语言中,习惯上使用第一个DB寄存器来访问共享(全局)数据块DB,而使用第二个DB寄存器来访问背景DB。
因此,这两个寄存器也分别被称作DB寄存器和DI寄存器。
但是,CPU对对此并不进行区分,对每一个数据块,均可以使用这两个寄存器中的任何一个予以打开(即使是两个数据块同时打开的情况下)。
CDB CDB(交换DB寄存器里的内容)指令是将DB寄存器和DI寄存器里的内容予以交换,也即,将DB寄存器里的内容传递到DI寄存器中去,同时也将DI寄存器里的内容传递到DB寄存器中去。
该指令既不影响ACCU1中的内容值,也不影响状态位。
L DBLG,L DILG:这些指令的功能是以字节为单位读出当前所打开的数据块的数据长度,。
通过这种数据长度信息,用户程序就可以在访问数据块DB之前,测试数据块的长度是否达到所要求的长度。
L DBNO,L DINO:这些指令的功能是读出当前打开的数据块号。
概述使用存储器间接寻址,要寻址的变量的地址位于一个地址(存储单元)中。
使用存储器间接寻址的程序语句包含如下部分:•指令(比如:OPN,A,L,等等。
)•地址标识符(DB,C ,T ,I ,QW ,MD ,等等。
)•以及一个[变量],该变量必须要用方括号括起来。
这个变量包含指令要访问的操作数地址(指针)。
根据所使用的地址标识符,指令将以这种特定的[变量]格式,将所存储的数据看做成字指针或者双字指针。
带有16位指针的指令可以使用16位指针来寻址定时器、计数器、或块(DB、FC、FB)。
所有的定时器和计数器指令都可以用间接寻址访问。
为了对定时器,计数器,或块寻址,需使用如T、C、DB、DI、FB、FC这些区域标识符。
寻址的操作数的地址存储在一个字中。
一个数据块既可以用DB寄存器打开,也可以用DI寄存器打开。
当间接打开数据块时(DB/DI),如发现指针内容为零,则DB/DI 寄存器也以值“0”装入,装入0值时不会触发错误。
逻辑块调用可以借助于UC或CC指令(而非CALL)直接进行寻址,但是这些块不能包含任何块参数或静态变量能包含任何块参数或静态变量。
这种字指针被看作一个整数(0 ... 65 535),它指的是定时器(T)、计数器(C)、数据块(DB,DI)或逻辑块(FC,FB)的号。
带有32位指针的指针下列地址可以使用32位指针以存储器间接寻址方式进行寻址:•用位逻辑操作寻址的位I、Q、M、DIX 或DBX可用作地址标识符•可以使用装载或传送指令来寻址的字节地址、字地址、双字地址。
IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID可用作地址标识符。
被寻址的操作数地址被视为一个32位的指针。
在双字中,最低有效位(从第0位到第2位)被视为位地址,接着16位(从第3位到第18位)被视为寻址操作数的字节地址。
对于从第19位到第31位,在间接寻址方式中未作定义。
节地址对于从第位在间接寻址方式中未作定义注意事项如果您要使用装载或传送指令以存储器间接寻址方式访问某一地址单元,就必须确保指针的位地址为“0”。
否则,在执行过程中,CPU就会触发一个运行错误。
装载32位指针常数使用如下的语法规则可以将32位指针常数装载到累加器ACCU1中:L P#<字节地址>.<位地址>L P#<><指针存储单元用于存储器间接寻址的16位和32位指针必须存储在下列某个区域中:•M–位存储区•L–本地数据区•D–数据块(DB或DI)指针地址区使用存储器间接寻址时,地址(存储单元位置)位于16位或32位地址中。
该地址可在下面某个区域中找到:该地址可在下面某个区域中找到•位存储器:作为绝对寻址操作数或作为变量通过符号表符号寻址。
•本地数据堆栈:作为绝对寻址操作数或块的声明部分声明的临时变量。
•全局(共享)数据块:作为绝对寻址操作数。
当全局(共享)数据块DB用作指针存储单元的时候,必须要考虑到:在进行访问之前,“合适的”数据块已经使用DB寄存器(比如:OPN DB)打开了。
•背景数据块:作为绝对寻址操作数。
在使用背景数据的时候,要遵循如下几点:组织块和功能:在功能或组织块里,存储在背景数据块中的指针可以如同存储在全局(共享)数据块中一样使用。
只需记住的是,这里使用的是DI寄存器而非DB寄存器。
功能块FB:通常在功能块中,背景数据,也即参数或静态变量,不能用于符号性的存储器间接寻址。
原则上,可以使用在声明段中所输入的“地址”,来对FB内部的本地数据进行绝对访问。
但是,如果该FB用作多重背景模型,必须要注意,该地址不是在背景DB中所指定的绝对地址,实际上是相对于AR2的地址。
注意事项当您将存储器间接寻址指针传递到块中,或者想要在静态变量中永久保存该值,就必须要将该指针值从该静态变量中拷贝到临时变量中,然后使用这个临时变量来完成访问。
.描述该示例表示的是,以数值“0”初始化数据块的输入的这样一个功能。
DB号是通过输入参数传递到功能中去的。
入参数传递到功能中去的首先,在Network 1中将要寻址的数据块打开,为此,将待传递的块号(输入参数:#dbnumber)拷贝到一存储器字(MW100)中。
然后使用该存储字将DB打开。
在network(段)2中,通过一个循环将该DB的前10个数据字设置为“0”,在该循环中,使用LOOP指令,由此将循环计数器存入MB50中。
接着,通过存储器间接寻址,经由MD 40,向该数据块DB的各个数据字中传送“0”值。
在进入循环之前,将数据块的最后一个数据字(DBW 18)的地址指针装载到MD 40中。
由于数值向DB中是逐字传送,而不是逐字节传送的,所以在每次循环扫描的时中由于数值向中是逐字传送而不是逐字节传送的所以在每次循环扫描的时候,MD40中的访问地址减去P#2.0。
注意事项为示例程序简单起见,本示例程序中没有对数据块号进行检查。
实际应用也很重要的是,要将初始地址和预设值为“0”的区域长度设计为“可参数化”的,并在打开DB之前进行检查,确定DB是否恰好具有所必需的长度。