第4章指令集详解 4.1.3 寄存器间接寻址 寄存器间接寻址模式通过将工作寄存器中内容作为数据存储有效地址(EA),可实现对数据空间 中任何存储单元的访问。实质上,工作寄存器中的内容变为一个指向指令要访问的数据存储单元 的指针。 因为该寻址模式允许在进行数据访问之前或之后,通过对EA进行递增或递减来修改工作寄存器中 的内容,因此可实现强大的功能。通过在访问操作执行的同一周期内对EA中的内容进行修改,寄 存器间接寻址可对顺序存储在存储区中的数据进行高效处理。表4-2给出了dsP1C30F1sPIC33F 所支持的间接寻址模式。 表4-2: 间接寻址棋式 间接模式 语法 功能(字节指令) 功能(字指令) 说明 无修改 [Wn] EA=[Wn] EA=[Wn] Wn中的内容形成EA。 执行前递增 [++Wn] EA=[Wn+=1] EA=[Wn+=2] 对Wn中内容进行递增以形成 EA。 执行前递减 【-wn EA=[Wn-=1] EA=[Wn-=2] 指令执行前对Wn中内容进行 递减以形成EA。 执行后递增 Wh++] EA=[Wn]+=1 EA=[Wn]+=2 Wn中内容形成EA,然后Wn中 内容进行递增。 执行后递减 [Wn-] EA=[Wn]-=1 EA=[Wn]-=2 Wn中内容形成EA,然后Wn中 内容进行递减。 寄存器偏移量 [Wn+Wb) EA=[Wn+Wb] EA=[Wn+Wb] Wn和Wb的和形成EA。Wn和 Wb中的内容未被修改。 表4-2显示有四种寻址模式对指令中使用的EA进行修改,且允许对工作寄存器进行以下更新: 执行后递增、执行后递减、执行前递增以及执行前递减。由于所有EA必须赋以字节地址,因此 EA将以2为单位进行更新以支持字模式指令。也就是说,在字模式中指令执行后/前递减将对存储 于工作寄存器中的EA减2,而指令执行前/后递增将对EA进行加2。该功能确保在EA修改之 后,EA将指向存储区中下一个相邻的字。例4-4说明了如何使用间接寻址对EA进行更新。 表4-2也阐明了使用寄存器偏移量模式寻址的情况,该寻址模式对距离一个工作寄存器中的基准 EA某个偏移量的数据进行寻址。该模式使用另外一个工作寄存器的内容,通过将两个指定的工 作寄存器相加来形成EA。该寻址模式不适用于字模式指令,但其提供了整个64KB偏移量范围。 注意,用来形成EA的工作寄存器中内容将不会被修改。例45说明了如何使用寄存器偏移量间 接寻址对数据存储区进行访问。 注: 带偏移量的M0v指令(第5-151页和第5-151页)提供了在间接寻址时可使用的立 4 即数偏移量寻址功能。在这些指令中,通过将工作寄存器的内容加到一个有符号的 10位立即数以形成EA。例4-6显示了如何利用这些指令实现从/向工作寄存器传送 数据。 2006 Microchip Technology Inc. DS70157BCN第4-5页
2006 Microchip Technology Inc. DS70157B_CN 第 4-5 页 第 4 章 指令集详解 指令集详解 4 4.1.3 寄存器间接寻址 寄存器间接寻址模式通过将工作寄存器中内容作为数据存储有效地址(EA),可实现对数据空间 中任何存储单元的访问。实质上,工作寄存器中的内容变为一个指向指令要访问的数据存储单元 的指针。 因为该寻址模式允许在进行数据访问之前或之后,通过对 EA进行递增或递减来修改工作寄存器中 的内容,因此可实现强大的功能。通过在访问操作执行的同一周期内对 EA 中的内容进行修改,寄 存器间接寻址可对顺序存储在存储区中的数据进行高效处理。表 4-2 给出了 dsPIC30F/dsPIC33F 所支持的间接寻址模式。 表 4-2: 间接寻址模式 表 4-2 显示有四种寻址模式对指令中使用的 EA 进行修改,且允许对工作寄存器进行以下更新: 执行后递增、执行后递减、执行前递增以及执行前递减。由于所有 EA 必须赋以字节地址,因此 EA将以2为单位进行更新以支持字模式指令。也就是说,在字模式中指令执行后/前递减将对存储 于工作寄存器中的 EA 减 2,而指令执行前 / 后递增将对 EA 进行加 2。该功能确保在 EA 修改之 后, EA 将指向存储区中下一个相邻的字。例 4-4 说明了如何使用间接寻址对 EA 进行更新。 表 4-2 也阐明了使用寄存器偏移量模式寻址的情况,该寻址模式对距离一个工作寄存器中的基准 EA 某个偏移量的数据进行寻址。该模式使用另外一个工作寄存器的内容,通过将两个指定的工 作寄存器相加来形成 EA。该寻址模式不适用于字模式指令,但其提供了整个 64KB 偏移量范围。 注意,用来形成 EA 的工作寄存器中内容将不会被修改。例 4-5 说明了如何使用寄存器偏移量间 接寻址对数据存储区进行访问。 间接模式 语法 功能 ( 字节指令 ) 功能 ( 字指令 ) 说明 无修改 [Wn] EA = [Wn] EA = [Wn] Wn 中的内容形成 EA。 执行前递增 [++Wn] EA = [Wn+=1] EA = [Wn+=2] 对 Wn 中内容进行递增以形成 EA。 执行前递减 [--Wn] EA = [Wn – =1] EA = [Wn – =2] 指令执行前对 Wn 中内容进行 递减以形成 EA。 执行后递增 [Wn++] EA = [Wn]+= 1 EA = [Wn]+= 2 Wn中内容形成 EA,然后 Wn中 内容进行递增。 执行后递减 [Wn--] EA = [Wn] – = 1 EA = [Wn] – = 2 Wn中内容形成 EA,然后 Wn中 内容进行递减。 寄存器偏移量 [Wn+Wb] EA = [Wn+Wb] EA = [Wn+Wb] Wn 和 Wb 的和形成 EA。 Wn 和 Wb 中的内容未被修改。 注: 带偏移量的 MOV 指令(第 5-151 页和第 5-151 页)提供了在间接寻址时可使用的立 即数偏移量寻址功能。在这些指令中,通过将工作寄存器的内容加到一个有符号的 10 位立即数以形成 EA。例 4-6 显示了如何利用这些指令实现从 / 向工作寄存器传送 数据
dsPIC30F/33F程序员参考手册 例4-4: 带有效地址更新的间接寻址 MoV.B[W0++1,[w13--J :字节传送[W0]至[w13] :执行后将0内容递增,执行后将W13内容递减 指令执行前: w0=0x2300 w13=0x2708 数据存储区0x2300=0x7783 数据存储区0x2708=0x904E 指令执行后: w0=0x2301 w13=0x2707 数据存储区0x2300=0x7783 数据存储区0x2708=0x9083 ADD w1,[--w5],[++w8] ;执行前将W5内容递减,执行前将W8内容递增 :将W1加至[W5],将结果存放到[w8] 指令执行前: w1=0x0800 w5=0x2200 w8=0x2400 数据存储区0x21FE=0x7783 数据存储区0x2402=0 KAACC 指令执行后: w1=0x0800 W5 0x21FE W8=0x2402 数据存储区0x21FE=0x7783 数据存储区0x2402=0x7F83 DS70157B_CN第4-6页 2006 Microchip Technology Inc
dsPIC30F/33F 程序员参考手册 DS70157B_CN 第 4-6 页 2006 Microchip Technology Inc. 例 4-4: 带有效地址更新的间接寻址 MOV.B [W0++], [W13--] ; 字节传送 [W0] 至 [W13] ; 执行后将 W0 内容递增,执行后将 W13 内容递减 指令执行前: W0 = 0x2300 W13 = 0x2708 数据存储区 0x2300 = 0x7783 数据存储区 0x2708 = 0x904E 指令执行后: W0 = 0x2301 W13 = 0x2707 数据存储区 0x2300 = 0x7783 数据存储区 0x2708 = 0x9083 ADD W1, [--W5], [++W8] ; 执行前将 W5 内容递减 , 执行前将 W8 内容递增 ; 将 W1 加至 [W5],将结果存放到 [W8] 指令执行前: W1 = 0x0800 W5 = 0x2200 W8 = 0x2400 数据存储区 0x21FE = 0x7783 数据存储区 0x2402 = 0xAACC 指令执行后: W1 = 0x0800 W5 = 0x21FE W8 = 0x2402 数据存储区 0x21FE = 0x7783 数据存储区 0x2402 = 0x7F83
第4章指令集详解 例4-5: 寄存器偏移量间接寻址 Mov.B【m0+w1],[w7+] :字节传送[W0+w1]至w7,执行后对7内容进行递增 指令执行前: w0=0x2300 W1 0x01FE w7=0x1000 数据存储区0x24FE=0x7783 数据存储区0x1000=0x11DC 指令执行后: w0=0x2300 W1 0x01FE w7=0x1001 数据存储区0x24FE=0x7783 数据存储区0x1000=0x1183 LAC [w0+W8],A ;将[w0+w8]装载至ACCA ;(符号扩展和零回填) 指令执行前: w0=0x2344 w8=0x0008 ACCA=0x0078779321 数据存储区0x234C=0xE290 指令执行后: w0=0x2344 w8=0x0008 ACCA 0xFF E290 0000 数据存储区0x234C=0xE290 例4-6: 用立即数偏移量进行传送的指令 MOV [W0+0x20],w1 :将[w0+0x20]传送到w1 指令执行前: w0=0x1200 W1 =0x01FE 数据存储区0x1220=0xFD27 4 指令执行后: w0=0x1200 W1 0xFD27 数据存储区0x1220=0xFD27 MOV W4,[w8-0x300] ;将W4传送到[w8-0x300] 指令执行前: W4=0x3411 w8=0x2944 数据存储区0x2644=0xCB98 指令执行后: W4=0x3411 w8=0x2944 数据存储区0x2644=0x3411 2006 Microchip Technology Inc. DS70157BCN第4-7页
2006 Microchip Technology Inc. DS70157B_CN 第 4-7 页 第 4 章 指令集详解 指令集详解 4 例 4-5: 寄存器偏移量间接寻址 例 4-6: 用立即数偏移量进行传送的指令 MOV.B [W0+W1], [W7++] ; 字节传送 [W0+W1] 至 W7,执行后对 W7 内容进行递增 指令执行前: W0 = 0x2300 W1 = 0x01FE W7 = 0x1000 数据存储区 0x24FE = 0x7783 数据存储区 0x1000 = 0x11DC 指令执行后: W0 = 0x2300 W1 = 0x01FE W7 = 0x1001 数据存储区 0x24FE = 0x7783 数据存储区 0x1000 = 0x1183 LAC [W0+W8], A ; 将 [W0+W8] 装载至 ACCA ; (符号扩展和零回填) 指令执行前: W0 = 0x2344 W8 = 0x0008 ACCA = 0x00 7877 9321 数据存储区 0x234C = 0xE290 指令执行后: W0 = 0x2344 W8 = 0x0008 ACCA = 0xFF E290 0000 数据存储区 0x234C = 0xE290 MOV [W0+0x20], W1 ; 将 [W0+0x20] 传送到 W1 指令执行前: W0 = 0x1200 W1 = 0x01FE 数据存储区 0x1220 = 0xFD27 指令执行后: W0 = 0x1200 W1 = 0xFD27 数据存储区 0x1220 = 0xFD27 MOV W4, [W8-0x300] ; 将 W4 传送到 [W8-0x300] 指令执行前: W4 = 0x3411 W8 = 0x2944 数据存储区 0x2644 = 0xCB98 指令执行后: W4 = 0x3411 W8 = 0x2944 数据存储区 0x2644 = 0x3411
dsPIC30F/33F程序员参考手册 4.1.3.1 寄存器间接寻址和指令集 表4-2中给出的寻址模式展示了dsPIC30F33F的间接寻址模式能力。出于操作编码和功能上的 考虑,并非所有支持间接寻址的指令都支持表4-2中所示的所有模式。使用间接寻址模式的大多 数指令支持无修改、执行前递增、执行前递减、执行后递增和执行后递减寻址模式。MOⅴ指令和 几种基于累加器的DSP类指令也具备使用寄存器偏移量寻址模式的能力。 注: 使用寄存器间接寻址的指令使用第3章“指令集概述”汇总表中的操作数符号Wd 和Ws。 4.1.3.2 DSP MAC间接寻址模式 DSP MAC类指令采用一类特殊的间接寻址模式。如后面第4.14节“DSPc类指令”中所介绍, DSP MAC类指令能够使用有效寻址两次从存储区取操作数。由于DSP算法经常需要更宽范围的 地址更新,DSP MAC类指令提供的寻址模式可实现更宽的有效地址更新大小范围。表4-3显示 X和Y存储区的预取都支持执行后递增和执行后递减寻址模式,且更新方式可为2、4和6字节。由 于DSP类指令只以字模式的方式执行,EA将不会以奇数方式进行更新。 表4-3: DSP MAC间接寻址模式 寻址棋式 X存储区 Y存储区 无修改的间接寻址 EA=[Wx] EA=[Wy] 执行后递增2的间接寻址 EA=[Wx]+=2 EA=[Wy]+=2 执行后递增4的间接寻址 EA=[Wx]+=4 EA=W]+=4 执行后递增6的间接寻址 EA=[Wx]+=6 EA=[Wy]+=6 执行后递减2的间接寻址 EA=[Wx]-=2 EA=[Wy]-=2 执行后递减4的间接寻址 EA=[Wx]-=4 EA=[Wy]-=4 执行后递减6的间接寻址 EA=[Wx]-=6 EA=[Wy]-=6 寄存器偏移量间接寻址 EA=W9+W12] EA=W11+W12] 注: 如第4.14节“DSP MAC类指令”中所述,只有W8和W9才可用来访问X存储区, 而只有W10和W11才可用来访问Y存储区。 4.1.3.3 棋寻址和位反转寻址模式 dsPIC30F/33F架构支持两种通常用来实现DSP算法的特殊寄存器间接寻址模式。模寻址(又称 循环寻址)提供了一种自动支持X和/或Y存储区中循环数据缓冲区的方法。模缓冲区使得软件 不再需要进行地址边界检查,这将改善某些算法的性能。类似地,位反转寻址可以实现以一种非 线性方式对缓冲区中的单元进行访问。这种寻址模式简化了用于基为2的FFT算法的数据重新排 序,并大大减少了FFT的处理时间。 这两种寻址模式体现了dsPIC:30F和dsPI1C33F架构的强大功能。使用间接寻址的任何指令都可 利用这两种寻址模式。有关使用模寻址和位反转寻址的详细内容,可参阅sPC30F系列参考 手册》(DS70046DCN). DS70157BCN第4-8页 2006 Microchip Technology Inc
dsPIC30F/33F 程序员参考手册 DS70157B_CN 第 4-8 页 2006 Microchip Technology Inc. 4.1.3.1 寄存器间接寻址和指令集 表 4-2 中给出的寻址模式展示了 dsPIC30F/33F 的间接寻址模式能力。出于操作编码和功能上的 考虑,并非所有支持间接寻址的指令都支持表 4-2 中所示的所有模式。使用间接寻址模式的大多 数指令支持无修改、执行前递增、执行前递减、执行后递增和执行后递减寻址模式。MOV 指令和 几种基于累加器的 DSP 类指令也具备使用寄存器偏移量寻址模式的能力。 4.1.3.2 DSP MAC 间接寻址模式 DSP MAC 类指令采用一类特殊的间接寻址模式。如后面第 4.14 节“DSP MAC 类指令”中所介绍, DSP MAC 类指令能够使用有效寻址两次从存储区取操作数。由于 DSP 算法经常需要更宽范围的 地址更新, DSP MAC 类指令提供的寻址模式可实现更宽的有效地址更新大小范围。表 4-3 显示 X和Y存储区的预取都支持执行后递增和执行后递减寻址模式,且更新方式可为2、4和6字节。由 于 DSP 类指令只以字模式的方式执行, EA 将不会以奇数方式进行更新。 表 4-3: DSP MAC 间接寻址模式 4.1.3.3 模寻址和位反转寻址模式 dsPIC30F/33F 架构支持两种通常用来实现 DSP 算法的特殊寄存器间接寻址模式。模寻址(又称 循环寻址)提供了一种自动支持 X 和/或 Y 存储区中循环数据缓冲区的方法。模缓冲区使得软件 不再需要进行地址边界检查,这将改善某些算法的性能。类似地,位反转寻址可以实现以一种非 线性方式对缓冲区中的单元进行访问。这种寻址模式简化了用于基为 2 的 FFT 算法的数据重新排 序,并大大减少了 FFT 的处理时间。 这两种寻址模式体现了 dsPIC30F 和 dsPIC33F 架构的强大功能。使用间接寻址的任何指令都可 利用这两种寻址模式。有关使用模寻址和位反转寻址的详细内容,可参阅 《dsPIC30F 系列参考 手册》(DS70046D_CN)。 注: 使用寄存器间接寻址的指令使用第 3 章 “指令集概述”汇总表中的操作数符号 Wd 和 Ws。 寻址模式 X 存储区 Y 存储区 无修改的间接寻址 EA = [Wx] EA = [Wy] 执行后递增 2 的间接寻址 EA = [Wx]+= 2 EA = [Wy]+= 2 执行后递增 4 的间接寻址 EA = [Wx]+= 4 EA = [Wy]+= 4 执行后递增 6 的间接寻址 EA = [Wx]+= 6 EA = [Wy]+= 6 执行后递减 2 的间接寻址 EA = [Wx]-= 2 EA = [Wy]-= 2 执行后递减 4 的间接寻址 EA = [Wx]-= 4 EA = [Wy]-= 4 执行后递减 6 的间接寻址 EA = [Wx]-= 6 EA = [Wy]-= 6 寄存器偏移量间接寻址 EA = [W9 + W12] EA = [W11 + W12] 注: 如第 4.14 节“DSP MAC 类指令”中所述,只有 W8 和 W9 才可用来访问 X 存储区, 而只有 W10 和 W11 才可用来访问 Y 存储区
第4章指令集详解 4.1.4 立即数寻址 在立即数寻址模式中,指令编码包含一个指令使用的预先定义常量操作数。该寻址模式可以独立 使用,但通常是同文件寄存器、直接和间接寻址模式联合使用。根据指令类型的不同,可以使用 长度不同的立即数操作数。常量的长度可以是1位(it1)、4位(bt4、t4和#Sit4)、5 位(糊it5)、6位(#SIit6)、8位(#it8)、10位(#it10和#Sit10)、14位(#it14)以及 16位(it16)。常量可以是有符号或无符号的,符号#Sit4、#Sit6和#St10指定为有符号常量, 而所有其他立即数常量都是无符号的。表44给出了每种立即数操作数在指令集中的使用。 表4-4: 指令集中的立即数操作数 操作数 指令使用 #it1 PWRSAV #bit4 BCLR,BSET,BTG,BTSC,BTSS,BTST,BTST.C,BTST.Z,BTSTS,BTSTS.C, BTSTS.Z 判it4 ASR,LSR,SL #Slit4 ADD,LAC,SAC,SAC.R #料it5 ADD,ADDC,AND,CP,CPB,IOR,MUL.SU,MUL.UU,SUB,SUBB,SUBBR,SUBR, XOR #Slit6 SFTAC 州t8 MOV.B 判t10 ADD,ADDC,AND,CP,CPB,IOR,RETLW,SUB,SUBB,XOR #Slit10 MOV 判t14 DISI,DO,LNK,REPEAT 判it16 MOV 4 2006 Microchip Technology Inc. DS70157BCN第4-9页
2006 Microchip Technology Inc. DS70157B_CN 第 4-9 页 第 4 章 指令集详解 指令集详解 4 4.1.4 立即数寻址 在立即数寻址模式中,指令编码包含一个指令使用的预先定义常量操作数。该寻址模式可以独立 使用,但通常是同文件寄存器、直接和间接寻址模式联合使用。根据指令类型的不同,可以使用 长度不同的立即数操作数。常量的长度可以是 1 位 (#lit1)、 4 位 (#bit4、 #lit4 和 #Slit4)、 5 位 (#lit5)、 6 位 (#Slit6)、 8 位 (#lit8)、 10 位 (#lit10 和 #Slit10)、 14 位 (#lit14)以及 16 位(#lit16)。常量可以是有符号或无符号的,符号 #Slit4、#Slit6 和 #Slit10 指定为有符号常量, 而所有其他立即数常量都是无符号的。表 4-4 给出了每种立即数操作数在指令集中的使用。 表 4-4: 指令集中的立即数操作数 操作数 指令使用 #lit1 PWRSAV #bit4 BCLR, BSET, BTG, BTSC, BTSS, BTST, BTST.C, BTST.Z, BTSTS, BTSTS.C, BTSTS.Z #lit4 ASR, LSR, SL #Slit4 ADD, LAC, SAC, SAC.R #lit5 ADD, ADDC, AND, CP, CPB, IOR, MUL.SU, MUL.UU, SUB, SUBB, SUBBR, SUBR, XOR #Slit6 SFTAC #lit8 MOV.B #lit10 ADD, ADDC, AND, CP, CPB, IOR, RETLW, SUB, SUBB, XOR #Slit10 MOV #lit14 DISI, DO, LNK, REPEAT #lit16 MOV