实验xx寻址实验
一、实验目的
通过对实验程序的调试熟悉确定指令中操作数存放地址的方法,掌握直接寻址和间接寻址等常用寻址方式的使用。熟悉常用伪指令的功能。
二、实验设备
CCS2.21、计算机
三、实验原理
1) 常用伪指令
伪指令是为汇编器提供管理信息和控制功能的指令,仅在汇编的过程中起作用并不产生目标代码。伪指令带有前缀“.”且必须小写,伪指令和它所带参数必须写在同一行。根据伪指令的功能不同可分为以下8类:
(1) 将代码和数据汇编进指定的段;
(2) 为未初始化的变量在存储器中保留空间;
(3) 控制是否产生清单文件;
(4) 初始化存储器;
(5) 汇编条件代码块;
(6) 定义全局变量;
(7) 为汇编器指定从中可以获得宏的库;
(8) 检查符号调试信息。
下面对常用伪指令和实验中使用的伪指令作简单介绍。
.mmregs 伪指令,该伪指令为C54x的寄存器定义全局符号名并将它们放入全局符号表中,从而在汇编编程时可以使用更有意义的名字来存取寄存器,便于程序维护。
.bss 伪指令,该伪指令为未初始化的数据段.bss保留存储空间。
例,.bss SAMPLE,10;为.bss 段保留10个字单元空间,SAMPLE标志符指示所保留空间的第一个位置。
.data 伪指令,该伪指令指定.data后面的代码为数据段,通常包含初始化的数据。
.text 伪指令,该伪指令指定.text后面的代码为文本段,通常包含可执行的代码。
.usect 伪指令,该伪指令为未初始化的命名段保留空间。
例,stack .usect ".STACK",100;定义段名为.STACK的未初始化段,且为该段保留100个字的空间。标志符stack指示该段的第一个存储单元地址。
.word 伪指令,该伪指令用来初始化一个或多个16位整数。即把16位的值放到当前段的连续的字中。
例,TABLE .word 5566h,1,2;将从TABLE开始的3个存储单元分别初始化为5566h,1和2。
.byte 伪指令,该伪指令用来初始化当前段里的一个或多个连续字。每个值的宽度被限制为8位。即把8位的值放入当前段的连续字。
.def 伪指令,该伪指令用来指出某一个或几个符号是在当前模块中定义的,在其它模块中可以使用。
.ref 伪指令,该伪指令用来指出某一个或几个符号是在其它模块中定义的,但可在当前模块中使用。
.global 伪指令,该伪指令用来声明某一个或几个符号为全局符号,使其在连接时可被其它模块使用。根据需要的不同它可以看成是.ref或.def。 .equ 和.set伪指令,该伪指令将值赋给符号,符号被存在符号表中,不能被重新定义。利用该伪指令可为常量或其它值取一个有意义的名字。
例,INDEX .equ 100/2 +113;用“INDEX”表示数值163。
2) 寻址方式
程序指令执行过程中,必然会涉及到操作数的提取。寻指令中操作数所在地址的方法即称为寻址方式。汇编语言编程中,编程者必须能够通过指令指出操作数的位置,以便将它们送入适当的空间去参加运算。掌握CPU的寻址方式是汇编语言编程的基础。
C54x共以下七种不同的寻址方式:
(1) 立即寻址
立即寻址是指指令中的操作数是一个立即数,用#表示。立即寻址只能用于源操作数。
例:LD #7850h,A ;将数源操作数7850h 送入A寄存器。
(2) 绝对寻址
绝对寻址是指指令中包含有所要寻址存储单元的16位地址。绝对寻址有下列4种类型:
①数据存储器(dmad)寻址,指令中包含操作数在数据存储器中的地址,地址可以是标志符或数字。
例,MVDK *AR3, 1000h;将AR3所指数据空间地址中的数据送入地址为1000h的数据存储器中。
②程序存储器(pmad)寻址,指令中包含操作数在程序存储器中的地址,地址可以是标志符或数字。
例,SAMPLE .set 2000h;用标志符SAMPLE表示数值2000h。
MVPD SAMPLE, *AR3;将SAMPLE所指定程序存储器地址中的数据送入AR3所指数据空间地址中。
③I/O端口(PA)寻址,指令中包含外部端口(PA)的地址,PA可以是标志符或数字。
例,PORTW *AR4,2000h;将AR4所指数据空间地址中的数据送入I/O口地址为2000h的端口中。
④*(lk)寻址,指令中包含操作数在数据存储器中的地址,(1k)指定数据空间的地址
例,LD *(SAMPLE),B;将SAMPLE指定数据存储器地址中的数据装入B寄存器。
(3) 累加器寻址
累加器寻址是指以累加器A中的内容作为地址去寻址程序存储器,完成程序空间和数据空间之间的数据交换
例,READA *AR3;以累加器A中的内容为地址去读取程序存储器,将读出的值写入AR3所指向的数据存储器。
(4) 直接寻址
直接寻址是指利用指令中的地址偏移量与数据页指针DP(ST0寄存器的0-8位)或堆栈指针SP组合,到数据空间中一个16位地址的方式。若ST1寄存器的CPL位为零,则以DP中的9位为地址高位,以指令中的7位为地址低位,构成16位的数据存储器地址。若ST1寄存器的CPL位为一,则将SP中的16位值与指令中的7位无符号数相加,构成16位的数据存储器地址。直接寻址的表示方法是在标志符或数值前加前缀@。
例,RSBX CPL;将CPL位清零,采用DP方式的直接寻址。
LD #3,DP;将数据页指针DP赋值3,使其指向第3页。
LD @60h,A;利用直接寻址确定数据存储器的地址为01E0h,将该地址的内容送入寄存器A。
(5) 间接寻址
间接寻址是指利用辅助寄存器(AR0~AR7)的内容作为地址访问存储器的寻址方式。实际上,前面几种寻址方式的例子中就已经用到了这种寻址方式。
根据辅助寄存器内容更新方式的不同又可以将该类寻址方式进一步分为:线性寻址、循环寻址和位反转寻址三类。
①线性寻址是指用于寻址的辅助寄存器的值线性变化。
例, STM #2000h,AR5;将立即数2000h送入存储器映射辅助寄存器AR5。
RPT #14 ;下一条指令算重复14+1=15次。
MVPD #1000h,*AR5+ ; 每执行一次,AR5的值加一。重复执行15次,将程序存储器中地址1000h开始的15个连续存储单元中的数据搬移到数据存储器中地址2000h开始的15个连续存储单元中。
②循环寻址就是对一块特定存储区实现循环访问的一种寻址方式。
循环寻址对需循环访问的特定存储区的起始地址有一定的要求。即,若设特定存储区大小为
R,N是使得2N>R的最小整数,则存储区的起始地址的最低N位必须为0。使用循环寻址时先将循环寻址的步长装入存储器映射寄存器AR0,循环寻址特定存储区的大小装入BK寄存器,可将BK看作是循环的周期。在指令中用%表示循环寻址。在数字信号处理中的FIR、卷积等运算中,循环寻址具有极其重要的意义。
将相对存储区起始地址的偏移量记为offset,步长记为step,循环寻址的算法如下:
If 0≦offset + step< BK; offset=offset + step;truncated c语言 Else if offset + step≧BK; offset = offset +step-BK; Else if offset +step < 0; offset = offset + step +BK。
例,STM #1,AR0;将立即数1送入存储器映射寄AR0,设置循环寻址的步长。
STM #1000h ,AR4;
STM #2000h ,AR5;
STM #16,BK;将立即数送入存储器映射寄存器BK,即循环周期为16。
RPTZ A,#20;将A寄存器清零,并重复下一条指令20+1=21次。
MAC *AR4+0%,*AR5+0%,A;首先将AR4所指数据空间地址中的数据与AR5所指数据空间地址中的数据相乘的结果与累加器A的值相加送入A,然后,寄存器AR4和AR5的值模BK值加的结果分别送入AR4和AR5。
③位反转寻址是为快速付立叶变换(FFT)设计的一种寻址方式。位反转寻址是利用二进制加法的反向进位实现的,即运算由左至右进行并产生进位。
一般情况下,若FFT点数为N,K是使得2K>N的最小整数,则要求原始数据存储区的起始地址的最低K位为0。使用位反转寻址要先将值N/2装入AR0。在指令中用B表示位反转寻址。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论