DSPC2000汇编指令汇编
DSP第四章 TMS320C20X系列的寻址方式及汇编指令
LT *0+
执行指令前: ARP=1, (AR1)=100H,(AR0)=3 执行操作: 用AR1所指的数据存储器100H内 容装载暂时寄存器; 执行指令后: ARP=1,(AR1)=103H
⑤减去索引量
方法
举例
指令使用AR内容作
LT *0-
为数据存储器地址,
执行指令后AR内容 执行指令前:
自动减去ARO的内容。 ARP=1, (AR1)=100H,(AR0)=3
执行操作:
用AR1所指的数据存储器100H内
容装载暂时寄存器;
执行指令后:
ARP=1,(AR1)=FEH
⑥加上索引量,反向进位
方法
举例
指令使用AR内容作为 数据存储器地址,执 行指令后AR内容自动 加上AR0的内容,该 加法采用反向进位方 法。 注:主要用于FFT算 法
LT *BR0+
把AR0加到辅助寄存器中时,地址以位倒序的方 式产生,即进位是从左向右,而不是从右向左进位。
LTP ind [,ARn]
MAC MAC pma , dma
乘且累加
MAC pma, ind [ , ARn]
MACD MACD pma, dma
乘且累加,并将被寻址数据移至下一单元
MACD pma, ind [, ARn]
MPY MPY dma
MPY ind [, ARn]
MPYA/MPYS
累加前次乘积,再将TREG与被寻址数相乘
PAC PAC
PREG转入累加器ACC
SPH
存储PREG高16位,直接或间接寻址
SPL
存储PREG低16位,直接或间接寻址
例1:MAC
0FF00H,02H ;DP=6,地址300H~37FH,PM=0, CNF=1
DSP_c2000_C语言编程要点
例 3、DSP 程序中比较通用的命名方法
1) 变量、常量和对象命名多用名词或形容词+名词,比如 ADC 的寄存器就可以命名为 “AdcRegs”。
例 2、Q 格式
由于 C2000 系列是定点 DSP,遇到小数时不能直接处理,所以就要想一些办法,通常 DSP 用 Q 格式来表示。当假定小数点位于第 0 位的右侧时,为 Q0;当小数电位于第 15 位的 右侧时为 Q15;若是 32 位处理器则最大可为 Q31。
浮点数和定点数转换的公示:
X 为浮点数, X 为定点数。
WDCR=0x0068; WDKEY=0X0055; WDKEY=0X00aa; printf(“hello,DSP world\n”); for(;;) ; } 首先,要禁止看门狗 watchdog。DSP 默认上电后看门狗会自动启动,时间一到就会令 DSP 复位。 其次,DSP 的 C 需要绝对定位,而主机的 C 的代码有操作系统定位。在“printf(“hello, DSP world\n”);”语句后,需要加设死循环语句“for(;;) ;”。标准 C 运行在操作系统下, 退出 main()函数后,控制权会交给操作系统。而一般 DSP 没有操作系统,退出 main() 函数即意味着程序跑飞了,所以要在主函数里加一个死循环。 在程序开头是通过宏定义去表示 watchdog 的寄存器,因为例子中用到的 DSP 芯片是 F240 系列的,而其 WDCR 和 WDKEYD7 寄存器的地址分别是 0x7029h 和 0x7025h,(volitial unsigned int*)表明 0x7029 是一个可被修改的无符号整型指针变量。
DSP2-3(c6000系列cpu结构和指令集)
2-3 2013.1主讲教师:任海鹏1. 8088CPU结构和240DSP流水线 2. C6000系列DSP的CPU结构 3. C6000系列DSP的指令基础 4. C6000系列DSP的流水线操作 5. 中断结构和中断响应《DSP原理及应用》2任海鹏CPU程序的执行顺序取指——PC控制 CPU上电PC=复位地址 第一条指令开始执行 随着节拍(时钟)顺 序(同步)执行下去 每一条指令的执行都是顺序安排好的。
问题:异步事件处理机制?《DSP原理及应用》3任海鹏中断的作用CPU按照节拍,将指令顺序地(或循环执行), 顺序执行的每一条操作是“同步”的。
如何来响应一些无法预知何时发生的操作或任 务呢? 两种可能的解决方法,一种是等待什么都不做; 一种是做其它事情,等到通知这个操作需要进行时, 在转到需要的操作。
《DSP原理及应用》4任海鹏中断的作用第二种方式就是中断方法,当有中断被响应 后,CPU停止当前的工作,去执行需要的操作,该 操作被执行后,需要返回原来的地方继续执行。
中断过程中存在两个操作的切换问题。
两个基本要求:被中断的程序执行到哪里要记住(保存)以便将来 返回; 到哪里去找要执行的中断操作要给出。
《DSP原理及应用》5任海鹏中断的入口和返回设计CPU的时候如何达到这两个要求呢?CPU中的中断返回指针寄存器IRP(NRP)来记忆当前程序 执行到哪里; CPU中的中断服务表指针寄存器ISTP用来指明中断发生后 到哪里去找要执行的程序。
《DSP原理及应用》6任海鹏中断的响应中断被响应以后发生的操作将要进入E1阶段的指令地址放入到中断返回寄存器IRP; 根据中断服务表指针中所指的地址去读取中断服务程序; 中断服务程序执行完后,一条B IRP指令可以使CPU从IRP 所指的地址开始重新执行被中断的程序。
《DSP原理及应用》7任海鹏中断的优先级一般需要执行的异步操作有多个,就需要设 置多个中断; 多个中断必要安排中断的优先级,使优先级 高的可以先响应; 同时中断服务表指针也要根据不同中断有所 不同; 中断源多了后,方便了应用,但对于简单应 用,要对不用的中断进行控制(屏蔽),需要一 些中断相关的一些控制寄存器。
TMS320C6000内联指令汇编
int_dotpn2 (intsrc1,intsrc2);
DOTPN2
将src1和src2中的16位有符号数进行点积相减
int_dotpnrsu2 (intsLeabharlann c1,unsignedsrc2);
DOTPNRSU2
LDHU
必须2byte对齐(读)
unsigned&_amem4 (void *ptr);
LDW
STW
必须4byte对齐(读或存)
const unsigned&_amem4_const (const void *ptr);
LDW
必须4byte对齐(读)
double&_amemd8 (void *ptr);
unsigned_bitr (unsignedsrc);
BITR
翻转比特位的顺序
int_cmpeq2 (intsrc1,intsrc2);
CMPEQ2
比较每16位的值是否相等,结果放入dst的最低2位
int_cmpeq4 (intsrc1,intsrc2);
CMPEQ4
比较每8位的值是否相等,结果放入dst的最低4位,相等置1,否则为0
long_lsadd (intsrc1,__int40_tsrc2);
SADD
将src1和src2相加,且饱和其结果
int_sat (__int40_tsrc2);
SAT
将一个40比特的long转换为一个32比特的有符号int,如有需要,对结果进行饱和
unsigned_set (unsignedsrc2,unsignedcsta,unsignedcstb);
DSP 第五章指令
C2000提供了4种修改方法: 例: 无增量或减量 加1或减1 加或减一个变址量
LT *0+ ;用当前AR所指的数据存 储器地址内容装载TREG, 然后向当前AR内容加上 AR0内容 。 LT *0- ;用当前AR所指的数据存 然后将当前AR内容减1。
储器地址内容装载TREG, 按逆向进位方式加或逆向借位方式减一个变址量
C2000提供了4种修改方法: LT *BR0+ ;用当前AR所指的数据存储器地址内容装载TREG, 然
后向当前AR内容加上 AR0内容 , 加法采用逆向进位方式。 无增量或减量 后将当前AR内容减1。减法采用逆向借位方式。 加1或减1 LT *BR0- ;用当前AR所指的数据存储器地址内容装载TREG,然 AR TREG
应注意 : 1. 在程序开始时必须初始化DP。 2. 如果程序中的所有指令均访问同一个数据页,只需在程序的 前面装入DP,而不必在采用直接寻址方式的每个指令之前设 置数据页。若访问新的数据页,需重新装新的DP值。 3. 用直接寻址方式的指令其操作数不加前缀“#”
例1: LDP ADD
Байду номын сангаас
#4 9h,5
直接寻址方式的数据存储器地址产生
状态寄存器ST0 D8 DP(9LSBs) D0 D15 8MSBs 指令操作码 指令寄存器 D8 D7 D6 0 7LSBs D0
D15 DP(9MSBs)
D7 D6 偏移量 (7LSBs)
D0
16位数据存储器地址
使用直接寻址方式访问数据存储器的步骤: 1)设置数据页面,将当前数据页面(0-511)装入DP: LDP #k 2)设置偏移量, 给出7位偏移量作为指令的一个操作数。 ADD 5Dh
三、指令句法描述
DSPC2000实时处理器手册
博客 — 阅读众多见解独到的博客帖子,内容涵盖新技术发现和“网络滞后”等各种话题。在这里您可以 一睹 TI 最优秀工程师的观点。
论坛 — 您可在 TI E2E 论坛上获得帮助。TI 的内外部工程师均会阅读该论坛,总会有人知道您问题的答 案。如果您也能为他人伸出援手并一展才华,那么欢迎您加入到论坛的互帮互助中来。
/c2000
C2000™ 微处理器 3
存储器总线与快速中断
C2000 MCU 具备 96 个中断矢量,可帮助您的设计项目实现 终极灵活性。C28x™ 微处理器内核专为实时控制而精心设 计,其快速中断能实现 10 个周期的上下文环境开关。
通过采用改进的哈佛架构 (Harvard architecture),32 位数据 与外设总线可确保内核、存储器以及外设能够实现高效 互动。高度安全的闪存、RAM 与 ROM 能保护您的知识产 权不被盗用。此外,部分器件还可提供六通道 DMA。
超过 100 种代码兼容的器件
新的 C2834x Delfino MCU 甚至可进 一步实现高达 600 MFLOPS 的极 限性能。与当前的 C2000 MCU 相 比,C2834x 平台能将代码大小 精简 52%,存储器存取时间减少 70%。此外,高分辨率 PWM 还支 持 65ps 的分辨率。全新的高速 度可使高端实时控制应用实现更
Communication Ports
Device
12-bit ADC
Channels/
Speed
RAM Flash ROM PWM HiRes Quadrature Event
第4章TMS320C2000DSP指令系统
指令字中 包含指令 所使用的 一个常数
立即寻址方式 的RPT操作码
短立即操作数 99(63h)
长立即数寻址方式举例
ADD #16384,2 ;将16384(4000h)左移2位 ;后与累加器内容相加,结果保存在累加器中 第1个指令字为指令操作码和移位数
;加,结果保存到当前辅助寄存器中。
MAR *+,AR5 ;将当前辅助寄存器的内容加1, ;并将5送到ARP,ARP原来的值送到ARB
参见:TMS320C20x用户 指南.pdf 第6、7章
4.3 ’C2000指令系统简介
‘C2xx DSP中共有汇编语言指令88条,分成6类: ①累加器、算术和逻辑指令26条如:ADD、LACC、AND ②辅助寄存器和数据页面指针指令7条如:MAR、LAR等 ③TREG、PREG和乘法指令20条如:LT、MTY、PAC等 ④分支、调用指令12条如:B、BCND、INTR等 ⑤控制指令15条如:SPM、POP、BIT等 ⑥存储器和I/O操作指令8条如:BLDD、SPLK、TBLR等 注:有些指令助记符是增强性指令,对应于几条简单指令(机器
立即寻址: LACC #lk[,shift] 长立即数经左移shift位后装入ACC, shift=0~15,shift=0时可不写;
LACC立即寻址举例
LDP #05h SPLK #0a5a5h,35h MAR *,AR3 LAR AR3,#02b5h LAR AR0,#0123h LACC #1234h,15 *1234h=01 0010 0011 0100b ——>左移15位 ——〉0 1001 0001 1010 0000 0000 0000 0000 b =91a0000h——〉ACC
第9讲 DSP的C及汇编语言
OnFileLoaded()函数
GEL文件—回调函数
该回调函数在加载program/symbol(.out)文件之后执行。 可以建立调试源搜索路径(在没有CCS工程文件的时候), 设定断点和探针,完成软件的复位和重启。
GEL文件—回调函数
OnReset()函数
当目标处理器复位后该函数被调用。如果你需要每次重
无论用哪种方法定义中断服务函数,都须注意以下问题:
(1)中断处理函数必须是void类型,而且不能有任何
输入参数。
(2)进入中断服务函数,编译器将自动产生程序保护 所有必要的寄存器,并在中断服务函数结束时恢复运行 环境。 (3)进入中断服务函数,编译器只保护与运行上下文 相关的寄存器,而不是保护所有的寄存器。中断服务函 数可以任意修改不被保护的寄存器,如外设控制寄存器 等。 (4)要注意IMR、INTM等中断控制量的设置。通常 进入中断服务程序要设置相应寄存器将中断屏蔽,退出 中断服务程序时再打开,避免中断嵌套。
需要注意的问题
(2)指针类型转换是必须的,关系到接收分配 好的内存块的地址可以向前看多少字节。 如果不做指针类型转换会怎么样? void * 指针存在的意义。
需要注意的问题
(3)内存块大小的可移植性问题
分配一个整型变量数组应使用: 数组元素个数 * sizeof(int) 确定内存块的大小 问题:sizeof和strlen函数的区别
/*进行CCS存储器映射,告知目标处理器哪些空间可以访问,哪些不可以访问。*/
Setup_Memory_Map( ); } OnTargetConnect( )//对处理器进行最小初始化 { Setup_Cache( ); //设置缓存L1P,L1D,L2 Setup_Pin_Mux( ); // 设置管脚 Setup_Psc_All_On( ); // 设置psc Setup_PLL0_594_MHz_OscIn( ); // 设置dsp主频[DSP @ 594 MHz][Core 1.20V] Setup_PLL1_DDR_135_MHz_OscIn();//设置ddr时钟频率 Setup_Aemif_8Bit_Bus( ); // 设置Async-EMIF[8-bit bus] }
dsp汇编指令
dsp中的汇编伪指令伪指令分类伪指令及其表示格式具体描述段定义伪指令 .asect “段名” , 地址汇编到一以绝对地址为起始的段中.bss 符号,字数[,块标号] 在未初始化数据段bss中保留空间.data 汇编到已初始化数据段data中.sect “段名”汇编到一已命名(已初始化)的段中.text 汇编到可执行代码段text中符号 .usect “段名”,字数[,块标号] 在一已命名(未初始化)的段中保留空间常数初始化伪指令(包括数据和地址常数) .bes 位数在当前段中保留位数(标号指向所保留空间的尾部).bfloat 数值初始化一个32位,IEEE单精度的浮点常数;禁止有跨页的初始化对象。
.blong 数值1[,…,数值n] 初始化一个或多个32位整数;禁止有跨页的初始化对象。
.byte 数值1[,…,数值n] 初始化当前段中一个或多个连续字节.field 数值1[,…,数值n] 初始化一个可变长度的字段.float 数值初始化一个32位,IEEE单精度的浮点常数.int 数值1[,…,数值n] 初始化一个或多个16位整数.long 数值1[,…,数值n] 初始化一个或多个32位整数.space 位数在当前段中保留位数(标号指向所保留空间的头部).string “字符串1”[,…,“字符串n”] 初始化一个或多个文本字符串.word 数值1[,…,数值n] 初始化一个或多个16位整数对准段程序计数器的伪指令 .align 在一页的边缘对准SPC(段程序计数器).even 在一偶数的边缘对准SPC定义输出列表格式的伪指令 .drlist 使所有伪指令行都被列出(缺省方式).drnolist 禁止某些伪指令行的列出.fclist 允许列出错误的条件代码块(缺省方式).fcnolist 禁止列出错误的条件代码块.length 页的长度定义源文件列表的页长.list 从头开始源文件的列表.mlist 允许宏列表和循环块(缺省方式).mnolist 禁止宏列表和循环块定义输出列表格式的伪指令 .nolist 停止源文件列表.option{B/D/F/L/M/T/X} 选择输出列表文件的参数.page 在源文件列表中生成一页.sslist 允许扩展子程序符号列表.ssnolist 禁止扩展子程序符号列表(缺省方式).tab 大小设置表的大小.title “字符串”在列表页头显示一个标题.width 页宽设置源文件列表的页宽外部文件定位的指伪令 .copy [“]文件名[”] 包含其他文件中的源语句.def 符号1[,…,符号n] 标明一个或多个在当前模块中定义而在其他模块中要用到的符号.global 符号1[,…,符号n] 标明一个或多个全局(外部)符号.include [“]文件名[”] 包含其他文件中的源语句.mlib [“]文件名[”] 定义宏定义库.ref符号1[,…,符号n] 标明一个或多个在另一模块中定义而在当前模块中要用到的符号条件汇编伪指令.break [确切定义的表达式] 如果条件满足,就结束.loop汇编。
DSP常用汇编语言指令简介
5. 控制指令举例
Example1:BIT0h,15 ;(DP = 6)把内存地址=300h 单元内容的最低位(BIT0)送给TC。 Example2:LDP #0h;使用立即数方式装载 数据页,也可以采用直接寻址和间接寻址方式装 载。 Example3:PUSH ;把累加器的低16位压入堆 栈。 Example4:SETC C;置进位C=1,也可以设置 以下的控制位为1或者为0,例如:CNF、INTM、 OVM、SXM、TC和XF。类似的指令还有: CLRC。
2. 工作寄存器等指令举例
Example4:ADRK #80h ;把当前工作寄存器内容 加一个立即数80h(注意立即数范围:00~FFh)。类 似的指令还有SBRK。 Example5:BANZ指令使用举例。例: MAR *, AR0 ;当前ARP=AR0 LAR AR1, #03h ;AR1内容赋值为03h LAR AR0, #60h ;AR0内容赋值为60h ZAC ; 累加器ACC清零 loop: ADD *+, AR1 ;把当前工作寄存器AR0指向 的内存单元数值加到ACC,然后AR0内容加1,当前工 作寄存器指针指向AR1 BANZ loop, *-AR0 ;判断AR0是否为0,否则程序 转到loop,同时AR0的内容减1。 南航自动化学院DSP技术应用实验 返回到第10页 室
南航自动化学院DSP技术应用实验 室
1. 累加器等指令举例
Example 1:ADD 1,1;(假设DP = 6),把 第6个数据页的第一个内存单元内容左移一 位加到累加器 Example 2:LACC *,4; (与SXM有关) Example 3:ROL;把累加器内容循环左移 Example 4:SACL *,0,AR7 ;把当前工作寄 存器指示内容左移0位送入累加器的低8位 Example 5:RPT #15 SUBC * ;累加器减去当前寄存 器指的内容,连续减16次,结果存累加器
DSP汇编指令总结
DSP汇编指令引言DSP是指数字信号处理器,是一种专门用于数字信号处理的微处理器。
DSP汇编指令是在DSP芯片上执行操作的命令。
这篇文档将常见的DSP汇编指令及其使用方法。
通用指令MOVMOV是Move的缩写,指将数据从一个寄存器移动到另一个寄存器或内存地址中。
它有很多不同的格式,例如:MOV R1, #0 ; 将0存储在R1寄存器中MOV R2, R1 ; 将R1寄存器中的值复制到R2寄存器中MOV @R3, R2 ; 将R2寄存器中的值存储在R3指向的内存地址中ADD和SUBADD和SUB分别表示加法和减法运算。
它们也有不同的格式,例如:ADD R1, R2 ; 将R2寄存器中的值加到R1寄存器中ADD R1, #2 ; 将2加到R1寄存器中SUB R1, R2 ; 将R2寄存器中的值从R1寄存器中减去AND和ORAND和OR分别表示按位与和按位或运算。
它们也有不同的格式,例如:AND R1, R2 ; 将R1寄存器和R2寄存器中的值按位与后存储在R1寄存器中OR R1, R2 ; 将R1寄存器和R2寄存器中的值按位或后存储在R1寄存器中CMPCMP是Compare的缩写,用于比较两个值。
它会将两个操作数相减,并设置相关的标志位。
它的格式如下:CMP R1, R2 ; 比较R1和R2寄存器中的值跳转指令JMPJMP是Jump的缩写,用于无条件跳转到目标地址。
它的格式如下:JMP label ; 跳转到标签为label的位置JNZ和JZJNZ和JZ分别表示如果结果不为零则跳转和如果结果为零则跳转。
它们的格式如下:JNZ label ; 如果前一条CMP指令比较结果不为零,则跳转到标签为label的位置JZ label ; 如果前一条CMP指令比较结果为零,则跳转到标签为label的位置JGE和JLEJGE和JLE分别表示如果大于或等于则跳转和如果小于或等于则跳转。
它们的格式如下:JGE label ; 如果前一条CMP指令比较结果大于或等于,则跳转到标签为label的位置JLE label ; 如果前一条CMP指令比较结果小于或等于,则跳转到标签为label的位置循环指令DJNZDJNZ是Decrement and Jump if Not Zero的缩写,表示如果操作数不为零则减1并跳转到目标地址。
DSP系统中C语言和汇编语言的混合编程
2
C语言和汇编语言的混合编程 C语言的存储器模型
1 C语言的存储器模型
C编译器产生的段
段名称 .text 已初 始化 段 .cinit .switch .const .bss 未初 始化 段 .stack .system 段内容 可执行代码和浮点常数 已初始化的全局变量和静态变量 的列表 用于多开关语句的跳转列表 已初始化的字符串、全局常量和 静态常量 全局和静态变量 软件堆栈 动态存储空间 存储器类型 ROM或RAM ROM或RAM ROM或RAM ROM或RAM RAM RAM RAM 页 0 0 0 1 1 1 1
独立的C和汇编模块接口
在编写汇编语言时必须遵循有关的寄存器规则和调用规 则,否则可能会破坏C的运行环境 在编写独立的汇编程序时,必须注意以下几点:
无论是C函数还是汇编函数,都必须遵循寄存器使用规则 必须保护函数要用到的几个专用寄存器,专用寄存器包括: AR0(FP)、AR1(SP)、AR6和AR7;其中,如果SP正 常使用的话,则不必明确加以保护,即只要汇编函数在返回 时弹出压入的对象,实际上就已经保护了SP 其它寄存器可以自由使用
18
C语言和汇编语言的混合编程 C语言与汇编语言的接口
2
19
C语言和汇编语言的混合编程 C语言与汇编语言的接口
在汇编语言中访问C程序变量
在C程序中定义全局变量 在汇编语言中使用.global声明为外部变量,变量名前加 下划线“_” 在汇编程序中正常地对变量访问
20
C语言和汇编语言的混合编程 C语言与汇编语言的接口
寄存器 AR0 AR1 AR2 AR2~AR5 AR6~AR7 ACC累加器 P T 结构指针 堆栈指针 局部变量指针 表达式分析 寄存器变量 表达式分析/返回值 表达式分析 表达式分析 用处 被调函数保护 Yes Yes No No Yes No No No
DSP汇编指令总结
DSP汇编指令总结DSP汇编指令总结⼀、寻址⽅式:1、⽴即寻址:短⽴即寻址(单指令字)长⽴即数寻址(双指令字)第⼀指令字第⼆指令字16位常数=16384=4000h2、直接寻址ARU 辅助寄存器更新代码,决定当前辅助寄存器是否和如何进⾏增或减。
N规定是否改变ARP值,(N=0,不变)4.3.1、算术逻辑指令(28条)4.3.1.1、加法指令(4条);4.3.1.2、减法指令(5条);4.3.1.3、乘法指令(2条);4.3.1.4、乘加与乘减指令(6条);4.3.1.5、其它算数指令(3条);4.3.1.6、移位和循环移位指令(4条);4.3.1.7、逻辑运算指令(4条);4.3.2、寄存器操作指令(35条)4.3.2.1、累加器操作指令(6条)4.3.2.2、临时寄存器指令(5条)4.3.2.3、乘积寄存器指令(6条)4.3.2.4、辅助寄存器指令(5条)4.3.2.5、状态寄存器指令(9条)4.3.2.6、堆栈操作指令(4条)4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条)4.3.3.2、程序存储器读写指令(2条)4.3.3.3、I/O操作指令(2条)4.3.4、程序控制指令(15条)4.3.4.1、程序分⽀或调⽤指令(7条)4.3.4.2、中断指令(3条)4.3.4.3、返回指令(2条)4.3.4.4、其它控制指令(3条)4.3.1、算术逻辑指令(28条)4.3.1.1、加法指令(4条);▲ADD▲ADDC(带进位加法指令)▲ADDS(抑制符号扩展加法指令)▲ADDT(移位次数由TREG指定的加法指令)4.3.1.2、减法指令(5条);★SUB(带移位的减法指令)★SUBB(带借位的减法指令)★SUBC(条件减法指令)★SUBS(减法指令)★SUBT(带移位的减法指令,TREG决定移位次数)4.3.1.3、乘法指令(2条);★MPY(带符号乘法指令)★MPYU(⽆符号乘法指令)4.3.1.4、乘加与乘减指令(6条);★MAC(累加前次积并乘)(字数2,周期3)★MAC(累加前次积并乘)★MPYA(累加-乘指令)★MPYS(减-乘指令)★SQRA(累加平⽅值指令)★SQRS(累减并平⽅指令)4.3.1.5、其它算数指令(3条);★ABS(累加器取绝对值指令)★NEG(累加器取补码指令)★NORM(累加器规格化指令)返回4.3.1.6、移位和循环移位指令(4条);▲ SFL(累加器内容左移指令)▲ SFR(累加器内容右移指令)▲ROL(累加器内容循环左移指令)▲ROR(累加器内容循环右移指令)返回4.3.1.7、逻辑运算指令(4条);▲ AND(逻辑与指令)▲ OR(逻辑或指令)▲ XOR(逻辑异或指令)▲ CMPL(累加器取反指令)返回4.3.2、寄存器操作指令(35条)4.3.2.1、累加器操作指令(6条)▲ LACC(装载累加器指令)▲ LACT(装载累加器)*按TREG低4位指定的次数移位▲ LACL(装载累加器低16位指令)▲ ZALR(装载累加器指令)▲ SACL(移位并存储累加器低半部)▲ SACH(移位并存储累加器⾼半部)返回4.3.2.2、临时寄存器指令(5条)▲ LT(装载TREG指令)▲ LTA(装载TREG并累加上次乘积指令)▲ LTS (装载TREG并减去上次乘积指令)▲ LTD(装载TREG并累加上次乘积及数据移动指令)▲LTP(装载TREG和累加器指令)返回4.3.2.3、乘积寄存器指令(6条)▲ PAC (乘积寄存器内容载⼊累加器)▲ APAC (PREG与累加器相加)▲ SPAC(累加器和乘积寄存器相减)▲ LPH(装载PREG⾼16位指令)▲ SPL(存储PREG低16位指令)▲ SPH(存储PREG⾼16位指令)返回4.3.2.4、辅助寄存器指令(5条)★LAR(装载当前辅助寄存器AR)★SAR(存储辅助寄存器指令)★MAR(修改当前辅助寄存器)★SBRK(从当前辅助寄存器减去短⽴即数)返回4.3.2.5、状态寄存器指令(9条)★LST(装载状态寄存器)★SST(存储状态寄存器)★SETC(控制位置“1”指令)★SETC(控制位置“1”指令)★LDP(装载数据指针DP指令)★BIT(位测试指令)★BITT(测试由TREG指定bit code指令)★CMPR(⽐较当前辅助寄存器AR和AR0)返回4.3.2.6、堆栈操作指令(4条)★PUSH(累加器低16位进栈指令)★POP(栈顶内容弹出⾄累加器低16位指令)★POP(栈顶内容弹出⾄累加器低16位指令)★POPD(弹栈⾄数据存储器指令)返回4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条)▲DMOV(数据存储器内部数据移动指令)▲SPLK(存储长⽴即数⾄数据存储器指令)▲BLDD(数据存储器内部的数据块移动)▲ BLPD(从程序存储器到数据存储器的数据块传送)4.3.3.2、程序存储器读写指令(2条)★TBLR(读程序存储器数据到数据存储器)★TBLW(写程序存储器)4.3.3.3、I/O操作指令(2条)★IN(数据输⼊指令)★OUT(数据输出指令)4.3.4、程序控制指令(15条)4.3.4.1、程序分⽀或调⽤指令(7条)★B(⽆条件转移指令)★BANZ(辅助寄存器内容不等于零转移)★CALL(⽆条件⼦程序调⽤指令)★BACC(按累加器内容转移指令)★CALA(由累加器指定地址的⼦程序调⽤指令)★CC(条件调⽤指令)4.3.4.2、中断指令(3条)★INTR(软中断指令)★TRAP(软件陷阱中断)★NMI(⾮屏蔽中断)4.3.4.3、返回指令(2条)★RET(⽆条件从⼦程序或中断返回)★RETC(条件返回指令)4.3.4.4、其它控制指令(3条)★RPT(重复执⾏下条指令)★NOP(空操作)★IDEL(暂停)返回。
DSP中C语言编程总结
DSP中C语言编程在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。
在C程序中定义的变量,编译为.asm文件后,都被放进了.bss区,而且变量名的前面都带了一个下划线。
在C程序中定义的函数,编译后在函数名前也带了一个下划线。
例如:extern int num就会变成 .bss _num, 1extern float nums[5]就会变成.bss _nums, 5extern void func ( )就会变成_func,一汇编和C的相互调用可以分以下几种情况:(1)汇编程序中访问c程序中的变量和函数。
在汇编程序中,用_XX就可以访问C中的变量XX了。
访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX[3]。
在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。
如果有参数传递,则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。
返回值是返回到A寄存器或者由A寄存器给出的地址。
同时注意,为了能够让汇编语言能访问到C语言中定义的变量和函数,他们必须声明为外部变量,即加extern 前缀。
(2)c程序中访问汇编程序中的变量如果需要在c程序中访问汇编程序中的变量,则汇编程序中的变量名必须以下划线为首字符,并用global使之成为全局变量。
如果需要在c程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,并且,要根据c程序编译时使用的模式是stack-based model还是register argument model来正确地编写该过程,使之能正确地取得调用参数。
(3)在线汇编在C程序中直接插入asm(“\t*** ”),内嵌汇编语句,需要注意的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控制允许寄存器等,但编译器并不检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。
4-C2000软件编程方法
.text section ;代码 .data section ;初始化数据 .bss section ;非初始化数据
编译器和连接器允许用户创建、命名和连接 自定义的段。
2、编译器处理COFF的段
编译器自动识别汇编程序的不同段,用如下命 令来支持此功能: .bss .usect .text .data .sect。 其中,.bss和.usect指令创建非初始化段,其他 指令创建初始化段。用户可以在任何段创建子 段,以更好的控制存储器映射,用.sect和.usect 指令来创建子段。 非初始化段占用存储器空间,多数分配到RAM. 初始化段包含可执行程序或初始化数据。 自定义段;子段。
3、连接器处理COFF的段
连接器主要有两个功能: 1)使用COFF中的段目的段,当多余1个文 件被连接时,它把这些段合并创建一个可执 行的COFF输出模块形式的段。 2)连接器为输出段选择存储器地址。
2、汇编编译指令
编译代码和数据到指定的段; 在存储区为非初始化变量保留存储空间; 控制列表文件的内容; 初始化存储器; 编译条件块; 声明全局变量; 指定程序要调用宏指令的宏指令库; 检查符号调试信息。
pragma伪指令 CODE_SECTION DATA_SECTION
C2000软件编程方法
CCS集成开发环境
CCS(Code Composer Studio, CCS)是TI 为其DSP系列芯片设计、应用和开发,而提 供的专业开发软件。作为一个集成开发环境, 它包括了:编辑、编译、汇编、链接、软件 仿真、调试以及配置、构造、跟踪、和实时 调试、分析程序等。有了它,大大加快软件 开发进程,提高工作效率。 一般来说,一种CCS只适用于一个系列的 DSP,如,CCS C2000就只适用于C2000系 列DSP。
第六章1_C2000寻址方式和指令系统
@@ 当使用C28x语法时,128字的数据页通过“@@‖符号来表示。 loc16 16位寻址方式指定地址单元的内容 loc32 32位寻址方式指定地址单元的内容 #16bitSingned 16位有符号立即数
第6章 寻址方式和汇编指令
6 .2 汇编语言指令集
指令集
▲ 按照字母的顺序对TMS320F2812的指令进行了详细的 介绍 ▲ 分析了各种可用的指令格式以及指令的功能和执行过程、 对状态位的影响等
符不能从源语句的第一列开始。它包括下列操作码之一:
√ 汇编指令(例如ABS, MPY, SPH); √ 伪指令(例如.data, .list, .set); √ 宏指令(例如.macro, .mexit)。 ▲ 操作数域 —— 是跟在助记符域后面的操作数列表,可缺省。如果多于两
个操作数,则用逗号隔开。它可以是常数、符号和表达式。
√ . copy―filename‖ 中的文件名; √ . sect―section name‖ 中的段名; √ . byte―charstring‖ 中数据初始化伪指令; √ . string 伪指令的操作数。 字符常数代表一个单独的整数值,而字符串是字符的列表。 ▲ 符号 —— 符号被用做标号、常数及替代符号。符号名最多可由32个字母和
第6章 寻址方式和汇编指令
6 . 1 寻址方式
间接寻址方式
XAR0到XAR7(辅助寄存器指针):在这种寻址方式下, 32位的XARn寄存器被当作一般性数据指针.可以通过指 令实现对辅助寄存器XARn加1,(操作前/后)减1和变 址操作.
寄存器寻址方式
在该寻址方式下,寄存器可以是访问的源操作数,也 可以是目标操作数,这样在F2812中就能实现寄存器到寄存 器的操作.这一方式包括对32位和16位寄存器的寻址。
精通 C2000 DSP 编程(2)
(C2000 DSP CLUB原创!连载!)精通C2000 DSP编程(2)在编程(1)中主要介绍了编程前的准备工作,在编程(2)中将通过一个经典的循环程序来介绍CCS的操作:CCS配置、建立工程、调试程序、断点、探针、变量观测、图形等等,通过学习这部分,可以掌握CCS操作的绝大部分,对于开发来说,已经够用了,你不需要再买什么CCS操作之类的书了,也不需要花太多的时间用在熟悉CCS操作之上。
一、CCS的配置在使用CCS之前需要针对不同类型的DSP器件进行开发环境的配置,现在以TMS320F2812为例,说明具体的配置方法,其他器件按照这里讲述的一样操作即可。
CCS正常安装完后会在桌面上出现这两个图标:先点击图标进入CCS配置环境,如下图所示:通常情况下安装完CCS后,第1次进入里面,系统已经将CCS配置为F2812 软仿真状态(软仿真和硬件仿真最主要的区别是软仿真不需要硬件仿真器,并且只可以测试与外设无关的程序,而硬件仿真需要仿真器支持,可以测试任何程序,硬件仿真将在后面的章节介绍。
),如上图所示,这里我们就选择系统默认的配置,对F2812做软仿真,这个时候将这两个界面Import Configuration和Code Composer Studio Setup关闭,在关闭的时候会出现以下对话框,点击“否”就好了,以后就可以通过点击进入CCS开发环境。
如果要改变系统的默认配置,比如我们要对F2810做软仿真的话,可以这样来操作:同样按照上面所说进入CCS配置环境,接着将下图关闭掉,然后进入下面的界面:右键点击F2812 Device Simulator-Remove,将其删除,如下图所示;接下来点击File-Import,出现下面的界面:然后在Family一栏中选择器件类型,这里选择F28xx,在Platform下面选择软仿真simulator,在Endianness下面选择all,再在最上面的Available Configurations下面选择F2810 Device Simulator,接着点击上图中的Import按扭和关闭Import Configuration界面,然后点击File-Save退出界面,同样关闭此界面的时候会出现一个“是”和“否”选择对话框,我们选择“否”就可以。
c2000,c5000,c6000系列DSP编程方法
二、TI公司三大系列内部结构的简介 1、C2000系列的内部结构1,C2000系列基于改进的哈佛结构,支持分开的程序空间和数据空间。
还有第三个空间,即I/O空间,用于片外总线接口。
外设总线映射到数据空间,因此,运行在数据空间的所有指令,都可以运行于所有的外设寄存器。
C2000系列的CPU包括:一个32位的中心算术逻辑单元(CALU)、一个32位的累加器(ACC)、CALU具有输入和输出数据定标移位器、一个16x16位乘法器、一个乘积定标移位器、数据地址产生逻辑:包括8个辅助寄存器和1个辅助寄存器算术单元(ARAU)、程序地址产生单元C2000系列采用2xLPASIC核,其内部设有6组16位的数据与程序总线。
这6组总线是:PAB(ProgramAddr.Bus)程序地址总线DRAB(Data-ReadAddr.Bus)数据读地址总线; DWAB(Data-WriteAddr.Bus)数据写地址总线; PRDB(ProgramReadBus)程序读总线;DRDB(DataReadBus)数据读总线;DWEB(DataWriteBus)数据写总线。
将数据读地址总线(DRAB)和数据写地址总线(DWAB)分开,CPU就可以在同一个机器周期内读和写数据。
C2000系列具有以下类型的片内存储器:双访问RAM(DARAM),即一个机器周期内可以访问两次的存器;FlashEEPROM或工厂掩模的ROM。
C2000系列的存储器分为单独可选择的4个空间,总共的地址范围为224K字:程序存储器(64K字);局部数据存储器(32K字);全局数据存储器(64K字);输入/输出(64K字)。
2、C5000系列的内部结构C5000系列中央处理单元CPU包括算术逻辑单元、乘法器、累加器、移位寄存器、各种专门用途的寄存器、地址发生器、比较选择单元、指数编码器。
具体内容如下①先进的多总线结构,具有1条程序存储器数据总线、3条数据存储器数据总线和4条地址总线;②40位算术逻辑单元(ALU),包括40位的桶形移位寄存器和2个独立的40位的累加器;③17位乘17位的并行乘法器与一个40位的专用加法器结合在一起,用于单周期乘/累加操作;④比较、选择和存储单元(CSSU),用于Viterbi操作(一种通信的编码方式)中的加/比较选择;⑤指数编码器用于在单周期内计算40位累加器的指数值;⑥2个地址生成器,包括8个辅助寄存器和2个辅助寄存器算术单元[6]。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章 DSP的寻址方式和汇编指令当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。
根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。
汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。
在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。
6.1汇编语言指令集概述在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。
在进行汇编讲解之前先来了解一下开发的核心——CPU。
在TMS320C2000系列中,CPU 内核为:C20x/C24x/C240x:C2xLP:C27x/C28x:C27x、C28x这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。
可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。
C28x芯片具有3种操作模式:1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统,因此,一般应使C28x芯片工作于该种模式。
2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。
在该模式下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。
3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x代码生成工具编译生成的。
在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。
本节假设条件为芯片工作于C28x模式(OBJMODE=1,AMODE=0)。
复位后,通过执行指令C28OBJ或者SETC OBJMODE将ST1中的OBJMODE位置1,芯片即可工作于C28x模式。
6.1.1 DSP中的操作数汇编语言离不开操作符和操作数,操作符可以认为就是CPU的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。
在应用程序的开发过程当中少不了的就是算术运算还有比较运算,当然在汇编语言编程的时候也是一样的,在汇编语言当中进行算术运算的操作并不像C/C++那样直观、方便,需要掌握众多的助记符才行,接下来会通过表6-2来说明一下关于算术方面的助记符以及与其相关的标志位。
表6-2影响指令的判断条件的说明在汇编程序当中实现乘法操作时一件非常不简单的事,由于是属于纯寄存器操作,因此,开发人员需要准备保存乘法结果的地址,在表6-1当中讲解操作数符号的时候有一个关于乘表6-3 PM与结果保存方式的关系6.1.2汇编语法指令描述前一小节提到过,汇编指令一般都由操作符和操作数组成,操作符也被称为指令助记符,它是指令中的关键字,表示本条指令操作类型,不能省略。
操作数可以省略,也可以有很多,但各操作数之间要用“,”分开。
指令助记符与操作数之间要用空格分开。
n为数值0~7,ARn指定下次的辅助寄存器。
ind:选择一下7种符号之一:*,*+,*-,*0+,*0-,*BR0+,*BR0-(兼容模式使用)。
#:立即寻址方式中常用的前缀。
数值前面带“#”,表示该数值为一个立即数。
<<左移。
>>右移。
@:当使用C28x语法时,64位字段数据与通过“@”符号来表示,一帮组程序员理解当前正在使用哪种寻址模式。
@@:当使用C28x语法时,128位字段数据页通过“@@”符号来表示。
loc16:16位寻址方式指定地址单元的内容。
loc32:32位寻址方式指定地址单元的内容。
#16bitsigned:16位有符号立即数。
6.2寻址方式通过6.1节当中读者们应当对汇编语言编程有了一定的了解,仅仅了解了汇编语言的操作符还是不过的,接下来就从汇编语言最根本的开始学习——寻址方式寻址方式就是寻找操作数或者操作数地址的方式,在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式或堆栈存取方式。
几乎所有的计算机,在内存中都采用地址指定方式。
当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。
C28x系列DSP的指令集采用7种寻址方式:1.直接寻址方式:DP(数据页指针),在此方式中,16位的DP寄存器被当做一个固定的页指针,讲指令中提供6未或者7位的地址偏移量与DP寄存器中的值组合起来就构成完整的地址。
当访问具有固定地址的数据结构时,这种寻址方式特别有用,例如,外设寄存器和C/C++中的全局及静态变量。
2.堆栈寻址方式:SP(堆栈指针),在这种方式下,16位的SP指针被用来访问软件堆栈的内容。
C28x系列的堆栈是从低端地址想高端地址生长的,SP总是指向下一个空的存储单元。
当需要访问堆栈中的数据时,SP的值减去指令仲提供的6位偏移量作为被访问数据的地址和,而堆栈指针将在入栈后加1,出栈前减1.3.间接寻址方式:XAR0到XAR7(辅助寄存器指针),在该方式下,32位的XARn寄存器被当做一般的数据指针来使用个。
通过相应的指令可以实现操作后XARn加1、操作前/后减1,还可以配合3位偏移量或者其他16位寄存器实现变址寻址。
4.寄存器寻址方式:这种方式下,另一个寄存器可以是该次访问的资源或者目的操作数。
这样在C28x中既能实现寄存器到寄存器的操作。
5.数据/程序/IO空间寻址方式:在这种方式下,存储器中操作数的地址被包含在指令中。
6.程序空间间接寻址方式:某些指令可以通过指针来访问位于程序空间中的存储器操作数。
由于在C28xCPU中存储器是统一寻址的,所以单周期内可以读取两个操作数。
7.字节寻址方式:该方式能访问到股东地址单元的最低有效位和最高有效位。
对于基于C28x的DSP芯片来说,以上的7种寻址方式仲出了IO空间寻址方式外其他的都支持。
C28x的大多数指令都是利用操作符中的8位字段来选择寻址方式和对寻址方式进行修改.在C28x的指令系统中,这个8位字段用于以下寻址方式:1.loc16:为16位数据访问选择直接/堆栈/间接/寄存器寻址方式。
[loc16]表示loc16这种寻址方式对应的16位数据。
2.loc32:为32位数据访问选择直接/堆栈/间接/寄存器寻址方式。
[loc32]表示loc32这种寻址方式对应的32位数据。
在直接寻址方式下,loc16/loc32指的是一个用标号表示的地址,这个地址由16位的DP寄存器和操作码内8位字段的6位或7位偏移量共同决定。
[loc16]/[loc32]表示这个地址对应的16/32位数据。
以上7种寻址方式都与“loc16/loc32”组合起来使用。
在间接寻址方式下,loc16/loc32表示放在辅助寄存器(XAR0~XAR7)中的一个地址,[loc16]/[loc32]表示这个地址对应的16/32位数据。
在堆栈寻址方式下,loc16/loc32表示堆栈指针指向的一个堆栈单元,[loc16]/[loc32]表示这个单元内的16/32位数据。
在寄存寻址方式下, loc16/loc32表示一个16位或32位寄存器(如ACC、P、XT、AH 等), [loc16]/[loc32]表示这些寄存器内的16/32位数据。
由于C28x提供了多种寻址方式,因此用寻址方式选择位(AMODE)来选择8位字段(loc16/loc32)的解码。
该位属于状态寄存器ST1。
寻址方式可以大致归类如下:(1)AMODE=0——该方式是复位后的默认方式,也是C28x的C/C++编译器使用的方式。
这种方式与C2xLP CPU的寻址方式不完全兼容。
数据页指针偏移量是6位(在C2xLP CPU 中是7位),并且不支持所有的间接寻址方式。
(2)AMODE=1——该方式包括的寻址方式完全与C2xLP 器件的寻址方式兼容。
数据页指针的偏移量是7位并支持所有C2xLP 支持的间接寻址方式。
编译器总是假定AMODE=0,所以它只使用对AMODE=0有效的寻址模式。
而汇编器可以通过设置命令行选项实现默认AMODE=0或者AMODE=1。
v28:假定AMODE=0(C28x寻址方式)v28 – m20:假定AMODE=1(与C2xLP全兼容的寻址方式)在文件中使用内嵌伪指令:. c28_amode :告诉汇编器后面的代码段都假定AMODE=0(C28x寻址方式). lp_amode :告诉汇编器后面的代码段都假定AMODE=1(与C2xLP全兼容的寻址方式)指令操作码仲的8位字段决定了loc16/32寻址方式,其可用的寻址方式总结见表6-4。
表6-4 loc16/loc32的寻址方式6.2.1直接寻址方式指令字中包含数据存储器的7位便宜地址与基地址构成16位数据存储器地址,基地址由数据页指针DP或堆栈指针SP提供,具体由ST1的CPL决定。
64K数据存储器包含512个数据页指针DP,DP的范围记为0~511.状态寄存器ST0内的第9位数据指针中的值来确定当前数据页。
具体的直接寻址方式如图6-1所示。
15~8位7位6~0位图6-1直接寻址方式假设需要访问数据空间地址0000105DH:(1)AMODE=0:使用直接寻址方式访问数据存储器时,必须首先对DP进行设置以确定数据页面,然后再书写进行某种操作的指令,该指令的操作数将确定数据页面内部的特定偏移单元。
其步骤如下:1. 设置数据页面将当前数据页面载入DP。
MOVW DP,#0041H ;初始化数据页面指针2. 设置偏移量给出6位偏移量作为指令的一个操作数。
ADD AL,@1Dh ; AL与当前数据页面内偏移1DH单元的内容相加,结果存入到AL中如图6-2所示直接寻址下AMODE为0的地址分配16bit6bit图6-2直接寻址下AMODE为0的地址分配(1)AMODE=1:1选择兼容选址模式SETC AMODE ;令AMODE=1.lp_amode ;通知编译器AMODE=12设置数据页面讲当前数据页面载入DPMOVW DP,#0040H ;初始化数据页面指针3设置偏移量给出7位偏移量作为指令的一个操作数。
ADD AL,@@5Dh ;AL与当前数据页面内偏移量5DH单元的内容相加,结果存入到AL中如图6-3所示直接寻址下AMODE为1的地址分配。
15bit7bit图6-3直接寻址下AMODE为1的地址分配6.2.2堆栈寻址方式在堆栈寻址方式下,16位的SP指针被用于访问软件堆栈的信息。