


已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 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 的位 objmod和e 位 amode的组合,选定模式。c28x 芯片具有3 种操作模式:c28x 模式: 在该模式中, 用户可以使用c28x 的所有有效特性、寻址方式和指令系统,因此, 一般应使c28x 芯片工作于该种模式。c27x 目标兼容模式:在复位时,c28x 的 cpu处于 c27x 目标 - 兼容模式。在该模式下, 目标码与c27xcpu完全兼容,且它的循环计数也与c27xcpu兼容。c2xlp 源兼容模式:该模式允许用户运行c2xlp 的源代码,这些源代码是用c28x 代码生成工具编译生成的。在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。本节假设条件为芯片工作于c28x 模式( objmode=,1amode=)0。复位后, 通过执行指令c28obj或者 setc objmod将e st1 中的 objmod位e 置 1,芯片即可工作于c28x 模式。6.1.1 dsp中的操作数汇编语言离不开操作符和操作数,操作符可以认为就是cpu的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。如表 6-1, 表 6-2 和表 6-3 对指令中常用到的一些操作数符号进行说明符号描述xarn32 位辅助寄存器xar0xar7 arn,arm32 位辅助寄存器xar0xar7的低 16 位arnh32 位辅助寄存器xar0xar7的高 16 位arpn32 位辅助寄存器指针,arp0指向 xar0,arp1指向 xar1 ar(arp)arp指向的辅助寄存器的低16 位xar(arp)arp指向的辅助寄存器ax累加器的高16 位寄存器ah或者 16 位寄存器al #立即数助记符pm乘积移位方式(+4 ,1 ,0, -1 , -2 , -3,-4 ,-5, -6 )pc22 位程序计数器按位求反码loc16loc16 寻址方式对应的16 位数据0: loc16将 loc16 寻址方式对应的16 位数据进行零扩展s: loc16将 loc16 寻址方式对应的16 位数据进行符号扩展loc32loc32 寻址方式对应的32 位数据0: loc32将 loc32 寻址方式对应的32 位数据进行零扩展s: loc32将 loc32 寻址方式对应的32 位数据进行符号扩展7bit表示 7 位立即数0:7bit7 位立即数,零扩展s:7bit7 位立即数,符号扩展8bit表示 8 位立即数0:8bit8 位立即数,零扩展s:8bit8 位立即数,符号扩展10bit表示 10 位立即数0:10bit10 位立即数,零扩展s:10bit10 位立即数,符号扩展16bit表示 16 位立即数0:16bit16 位立即数,零扩展s:16bit16 位立即数,符号扩展22bit表示 22 位立即数0:22bit22 位立即数,零扩展s:22bit22 位立即数,符号扩展lsb最低有效位lsb最低有效字节lsw最低有效字msb最高有效位msb最高有效字节msw最高有效字obj对于某条指令,位objmod的e 状态n重复次数( n=0,1,2,3,4,5,6)可选字段=赋值=等于表 6-1 操作数符号及说明cond语法描述测试标志位0000neq不等于z=00001eq等于z-10010gt大于(有符号减法)z=0 且 n=10011geq大于或等于(有符号减法)n=00100lt小于(有符号减法)n=10101leq小于或等于(有符号减法)z=1 或 n=10110hi高于(无符号减法)c=1 且 z=00111his, c高于或相同(无符号减法)c=11000lo,nc低于(无符号减法)c=01001los低于或相同(无符号减法)c=1 或 z=01010nov无溢出v=01011ov溢出v=11100ntc测试位为0tc=01101tc测试位为1tc=11110nbiobio 输入等于零bio=01111unc无条件表6-2 影响指令的判断条件的说明在应用程序的开发过程当中少不了的就是算术运算还有比较运算,当然在汇编语言编程的时候也是一样的,在汇编语言当中进行算术运算的操作并不像c/c+那样直观、方便,需要掌握众多的助记符才行,接下来会通过表6-2 来说明一下关于算术方面的助记符以及与其相关的标志位。在汇编程序当中实现乘法操作时一件非常不简单的事,由于是属于纯寄存器操作,因此, 开发人员需要准备保存乘法结果的地址,在表 6-1 当中讲解操作数符号的时候有一个关于乘积操作的符号pm,那么它的结果保存是如何执行的呢?下面通过表6-3 来说明一下。pm保存方式+4p( 31:4 ) =相乘结果中低38 位的( 27:0 ),p( 3:0 )+0+1p( 31:1 ) =相乘结果中低38 位的( 30:0 ),p( 31)+00p( 31:0 ) =相乘结果中低38 位的( 31:0 )-1p( 31:0 ) =相乘结果中低38 位的( 32:1 )-2p( 31:0 ) =相乘结果中低38 位的( 33:2 )-3p( 31:0 ) =相乘结果中低38 位的( 34:3 )-4p( 31:0 ) =相乘结果中低38 位的( 35:4 )-5p( 31:0 ) =相乘结果中低38 位的( 36:5 )-6p( 31:0 ) =相乘结果中低38 位的( 37:6 )表 6-3 pm 与结果保存方式的关系6.1.2 汇编语法指令描述前一小节提到过, 汇编指令一般都由操作符和操作数组成,操作符也被称为指令助记符, 它是指令中的关键字,表示本条指令操作类型,不能省略。 操作数可以省略, 也可以有很多, 但各操作数之间要用“, ”分开。指令助记符与操作数之间要用空格分开。arn: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 的大多数指令都是利用操作符中的位字段来选择寻址方式和对寻址方式进行修改在 c28x 的指令系统中,这个位字段用于以下寻址方式:1. loc16 :为位数据访问选择直接堆栈间接寄存器寻址方式。loc16表示 loc16这种寻址方式对应的16 位数据。2. loc32 :为位数据访问选择直接堆栈间接寄存器寻址方式。loc32 表示 loc32 这种寻址方式对应的 32 位数据。在直接寻址方式下, loc16/loc32 指的是一个用标号表示的地址,这个地址由 16 位的dp寄存器和操作码内 8 位字段的 6 位或 7 位偏移量共同决定。 loc16 /loc32 表示这个地址对应的 16/32 位数据。以上 7 种寻址方式都与“ loc16/loc32 ”组合起来使用。在间接寻址方式下, loc16/loc32 表示放在辅助寄存器( xar0xar)7 中的一个地址,loc16/loc32表示这个地址对应的16/32位数据。在堆栈寻址方式下, loc16/loc32 表示堆栈指针指向的一个堆栈单元, loc16/loc32表示这个单元内的16/32 位数据。在寄存寻址方式下,loc16/loc32表示一个16 位或 32 位寄存器(如acc、 p、xt、 ah等), loc16/loc32表示这些寄存器内的16/32 位数据。由于 c28x 提供了多种寻址方式,因此用寻址方式选择位( amod)e 来选择位字段(loc16/loc32)的解码。该位属于状态寄存器st1。寻址方式可以大致归类如下:(1) amode 该方式是复位后的默认方式,也是c28x 的 c/c+编译器使用的方式。这种方式与c2xlp cpu 的寻址方式不完全兼容。数据页指针偏移量是位(在c2xlp cpu中是位),并且不支持所有的间接寻址方式。(2) amode 该方式包括的寻址方式完全与c2xlp 器件的寻址方式兼容。数据页指针的偏移量是位并支持所有c2xlp 支持的间接寻址方式。编译器总是假定amode=,0 所以它只使用对amode=0有效的寻址模式。而汇编器可以通过设置命令行选项实现默认amode=0或者 amode=。1v28: 假定 amode=(0 c28x 寻址方式)v28 m20: 假定 amode=(1 与 c2xlp 全兼容的寻址方式)在文件中使用内嵌伪指令:. c28_amode :告诉汇编器后面的代码段都假定amode=(0 c28x 寻址方式). lp_amode :告诉汇编器后面的代码段都假定amode=(1 与 c2xlp全兼容的寻址方式)指令操作码仲的8 位字段决定了loc16/32寻址方式,其可用的寻址方式总结见表6-4 。amode=0amode=18 位译码loc16/32语法8 位译码loc16/32语法直接寻址方式(dp)0 06位数0 1 位7 数堆栈寻址方式(sp)0 1*-sp6位数1 0*sp+1 0 111 101*sp+1 0111110*-sp1 0 111 110*-spc28x 间接寻址方式(xra0到 xra7)10000aaa*xarn+10000aaa*xarn+10001aaa*-xran10001aaa*-xran10010aaa*+xranar010010aaa*+xranar010011aaa*+xranar110011aaa*+xranar11 0aaa*+xran3 位数 表 6-4 loc16/loc32的寻址方式6.2.1 直接寻址方式指令字中包含数据存储器的7 位便宜地址与基地址构成16 位数据存储器地址,基地址由数据页指针dp或堆栈指针sp提供,具体由st1 的 cpl决定。 64k 数据存储器包含512 个数据页指针dp,dp的范围记为0511. 状态寄存器st0 内的第 9 位数据指针中的值来确定当 前数据页。具体的直接寻址方式如图6-1 所示。158位7位60位操作码i=0数据存储器的地址图 6-1 直接寻址方式直接寻址方式下loc16/loc32的语法说明如表6-5 所示。amod(e st1.8 )偏移量每页大小32 位数据地址寻址范围06位数64 字(3222)=0 (216)=dp : 150(50)=6位数数据空间的低 4m 字的范围1位7数128 字(3222)=0(217)=dp : 150(60=7) 位数表 6-5 直接寻址方式下loc16/loc32的语法说明假设需要访问数据空间地址0000105dh:(1) amode=0:使用直接寻址方式访问数据存储器时,必须首先对dp进行设置以确定数据页面,然后 再书写进行某种操作的指令,该指令的操作数将确定数据页面内部的特定偏移单元。其步骤如下:1. 设置数据页面将当前数据页面载入dp。movw dp,#0041h;初始化数据页面指针2. 设置偏移量给出 6 位偏移量作为指令的一个操作数。add al, 1dh; al与当前数据页面内偏移1dh单元的内容相加,结果存入到al中如图 6-2 所示直接寻址下amode为 0 的地址分配16bit6bit0000000001000001011101dp:0041hoffset:1dh图 6-2 直接寻址下amode为 0 的地址分配(1) amode=1:1 选择兼容选址模式setc amode; 令 amode=1.lp_amode;通知编译器amode=1 2 设置数据页面讲当前数据页面载入dpmovw dp,#0040h;初始化数据页面指针3 设置偏移量给出 7 位偏移量作为指令的一个操作数。add al,5dh ;al 与当前数据页面内偏移量5dh单元的内容相加,结果存入到al 中如图 6-3 所示直接寻址下amode为 1 的地址分配。15bit7bit0000000001000001011101dp:0040hoffset:5dh图 6-3 直接寻址下amode为 1 的地址分配6.2.2 堆栈寻址方式在堆栈寻址方式下,16 位的 sp指针被用于访问软件堆栈的信息。c28x 的堆栈从存储器的低地址变化到高地址( 小端方式 ) , sp 指针总是指向下一个空单元当需要访问堆栈中的数据时,由程序提供位偏移量,sp 的值减去这位的偏移量就是被访问的数据的地址,然后修改堆栈指针,堆栈寻址方式下loc16/loc32的语法说明见表6-6 所示。amod(e st1.8 )偏移量32 位数据地址寻址范围0*-sp6位(3216)=0 (150)=sp-6位x*sp+(3216)=0(150)=sp如果 loc16 , sp=sp+1数据空间的低 64k如果 loc132 , sp=sp+2字的范围x*-sp(3216)=0(150)=sp如果 loc16 , sp=sp-1如果 loc132 , sp=sp-2表 6-6 堆栈寻址方式下loc16/loc32的语法说明下面的例子是带偏移量的堆栈寻址方式访问对栈区16/32 数据 , 当 amode=0时: add al,*-sp5;将( sp-5)指向堆栈单元的16 位内容加到al;mov *-sp8,al;将 al中的 16 位内容存入( sp-8)指向的堆栈单元addl acc,*-sp12 ;将( sp-12)指向的堆栈单元的32 位内容加到accmovl *-sp34,acc ;讲讲 acc中的 32 位内容存入(sp-34)指向的堆栈单元下面的例子是利用堆栈寻址方式递增访问堆栈区16/32 为数据:mov *sp+,al;将 16 位 al 寄存器的值压入栈顶,且sp=sp+1movl *sp+,p;将 32 位 p 寄存器的值压入栈顶,且spsp+2最后通过例子来讲解一下通过堆栈寻址方式递减访问堆栈区16/32数 据 : add al,*-sp;sp=sp-1,再把新sp指向的 16 位堆栈的内容加到al中movl acc,*-sp;sp=sp-2,再把新的sp指向的 32 位堆栈内容移到acc中6.2.3 间接寻址方式间接寻址方式的基本概念是指cpu对操作数读写时, 通过辅助寄存器中存放的地址访问操作数。逻辑上来讲是在间接寻址方式下,32 位的 xarn(辅助寄存器)被当做是一般性数据指 针。其内容是操作数所在数据存储器的32 位地址, cpu通过这个地址来取操作数。可以通过指令实现对辅助寄存器xarn加 1 加 2、减 1 减 2 和变址操作(操作前/ 后), c28x 的间接寻址方式( xar0xar)7。例如指令: movl acc, *xar2+; 假设 xar2的值位 0x80100h ,内容地址0x80100 的存储单元内容位1234h,0x80101 的内容位5678h,执行这条指令后, acc=56781234h,xar2=80102h。在物理上来看间接寻址方式下执行指令: movl acc,*xar2+,地址和数据通过寄存器和总线传送,当cpu 将这条指令从程序空间读出并译码后,aeau把 xar2 中存放的地址0x00080100 发送到 drab上, 然后 cpu通过 drdb把内存单元数据56781234h 读到数据缓冲寄存器 , 在发送操作数总线上( 至此寻址过程结束),alu 读取 drdb的数据 , 经过处理后发送结果到结果总线 , 然后放入 acc中。间接寻址方式的loc16/loc32语法说明见表6-7 所示。x*xarn+如果 loc16 , xarn=xarn+1如果 loc32 , xarn=xarn+2arp=nx*-xarn(310)=xarn如果 loc16 , xarn=xarn-1如果 loc32 , xarn=xarn-2x*+xarnar0arp=n(310)=xarn+ar0x*+xarnar1arp=nxacc访问 32 位寄存器acc。当寄存器 acc位目的地操作数是,z、n、v、c、ovc等标志可能会受到影响xp访问 32 位寄存器pxxt访问 32 位寄存器xtxxarn访问 32 位寄存器xarnxal访问 16 位寄存器al。ah的内容不受影响。当al位目的操作数时, z、n、v、c、ovc等标志可能会受到影响xah访问 16 位寄存器ah。al 的内容不受影响。当ah位目的操作数xpl时, z、n、v、c、ovc等标志可能会受到影响访问 16 位寄存器pl。寄存器ph的内容不受影响xph访问 16 位寄存器ph。寄存器pl 的内容不受影响xth访问 16 位寄存器th。寄存器tl 的内容不受影响xsp访问 16 位寄存器spxarn访问 16 位寄存器ar0 ar7的内容。 寄存器 arh0 arh7的内容不表 6-8 寄存器寻址方式下的loc16/loc32语法说明下面通过以下简单的例子来说明一下在汇编程序当中的寄存器寻址的相关操作。1、acc寄存器寻址32 位数据movl xar6,acc; 将 acc的内容装入到xar6movlacc,xt;将 xt寄存器的内容装入到acc addlacc,acc;acc=acc+acc2、p 寄存器寻址32 位数据movl xar6,p;将 p 的内容装入到xar6 movl p,xt;将 xt 寄存器的内容装入p addl acc,p;acc+acc+p3、ax寄存器寻址16 位数据mov ph,al;将 al 的内容装入到ph add ah,al;ah=ah+almov t,al;将 al 的内容装入t6.2.5 数据/ 程序/io空间立即寻址方式在该寻址方式下,存储器操作的地址就存在指令中。数据/ 程序 /io空间立即寻址方式的说明见表6-9 所示。语法地址说明*(0:16位)32 位数据地址: (31:16)=0、(15 :0)=16 位立即数ps:指令重复执行时地址在操作后+1,只能寻址数据空间的低64k*(pa)32 位数据地址: (31:16)=0、(15 :0)=16 位立即数ps:指令重复执行时地址在操作后+1, 0: pma22 位程序地址: (21:16)=0、(15 :0)=pmaps:指令重复执行时地址在操作后+1,只能寻址数据空间的低64k*(pma)22 位程序地址: (21:16)=0x3f、 (15 : 0)=pma ps:指令重复执行时地址在操作后+1,只能寻址数据空间的高64k表 6-9 数据 / 程序/io 空间立即寻址方式下的指令语法说明6.2.6 程序空间间接寻址方式某些指令可以通过使用间接指针对程序空间中的存储器进行访问。因为 c28xcpu的存储器是标准一致的,使用的是统一寻址,这就使在一个机器周期中进行两次读操作成为可能。程序空间间接寻址方式说明见表6-10 所示。语法地址说明*al22 位程序地址:(21:16)=0x3f、(15 :0)=alps:如果指令重复执行, al 的地址会被复制到影子寄存器,同时其地址会在每一执行后 +1,寄存器 al 中断内容没有改变。 只能寻址数据空间的高 64k*xar722 位程序地址:(21 : 0)=xar7ps:如果该指令重复执行,只有在指令 xpread和 xpwrite中, xar7中存放的地址才能被复制到影子寄存器中, 同时地址置将会在每次执行都 +1,寄存器 xar7的值并没有被修改,对于其他指令即使重复执行,地址值也不增加*xar7+22 位程序地址:(21 : 0)=xar7 如果是 16 位数据操作,xar7+=1 如果是 32 位数据操作,xar7+=2ps:如果指令被重复执行,地址每次执行后增加 1表 6-10 程序空间间接寻址方式下的指令语法说明6.2.7 字节寻址方式字节寻址方式见表6-11语法说明*+xarnar0*+xarnar1*+xarn3bit32 位数据地址 (31:0)=xarn+ 偏移量 ( 即 ar0/ar1/3bit)如果 ( 偏移量 =偶数 ) ,访问 16 位存储单元的最低有效字节;其最高字节不受影响如果 ( 偏移量 =偶数 ) ,访问 16 位存储单元的最高有效字节;其最低字节不受影响ps:其他寻址方式只能访问固定地址单元的最低有效字节,而不影响最高有效字节表 6-11 字节寻址方式语法说明字节寻址的例子如下:mov ax.lsb,loc16;若( 地址方式 =*+xarnar0/ar1/3bit);若( 偏移量 =偶数值 ) , ax.lsb=loc16.lsb, ax.msb=0x00;若( 偏移量 =奇数值 ) , ax.lsb=loc16.msb , ax.msb=0x00;否则 ,ax.lsb=loc16.lsb,ax.msb=0x00movb ax.msb,loc16;若( 地址方式 =*+xarnar0/ar1/3bit);若( 偏移量 =偶数值 ) , ax.lsb=原值, ax.msb= loc16.lsb;若( 偏移量 =奇数值 ) , ax.lsb=原值, ax.msb=loc16.msb;否则 ,ax.lsb=loc16.lsb,ax.msb=loc16.lsb6.3 c28x汇编操作指令在 c28x 系列的 dsp当中有超过150 条的汇编指令, 按照功能来分可分位15 类,接下来通过表格的方式向读者解释一下最常用的指令。1. 对辅助寄存器(xar0xar)7 的操作cpu提供了 8 个 32 位的辅助寄存器:xar0、xar1、xar2、 xar3、xar4、xar5、xar6和 xar7。可以作为地址指针指向存储器,或者作为通用目的寄存器来使用。许多指令可以访问xar0xar7的低 16 位,其中,辅助寄存器的低16 位为 ar0ar7,它们用作循环控制和16位比较的通用目的寄存器。当访问ar0ar7时,寄存器的高16 位( ar0har7)h 可能改变或者不改变,着主要取决于所应用的指令。ar0har7h只能作为xar0xar7的一部分来读取,不能单独进行访问。具体操作看表6-12 。助记符说明add xarn, #7bit7 位立即数加到辅助寄存器xarn adrk #8bit8 位立即数加到当前辅助寄存器cmpr 0/1/2/3比较辅助寄存器mov ar6/7, loc16loc16加载到辅助寄存器mov loc16 , arn存储 16 位辅助寄存器到loc16 mov xarn, pc保存当前程序指针到辅助寄存器movb xarn, #8bit8 位立即数加载到辅助寄存器xarn movb ar6/7, #8bit8 位立即数加载到辅助寄存器ar6/7 movl xarn, loc32loc32加载 32 位辅助寄存器 movl loc32 , xarn存储 32 位辅助寄存器内容到loc32movl xarn, #22bit用 22 位立即数加载32 位辅助寄存器xarn movz arn, loc16加载 xarn的低 16 位清除高16 位sbrk #8bit从当前辅助寄存器仲减去8 位立即数subb xarn, #7bit从辅助寄存器xarn中减去 7 位立即数表 6-12 对寄存器xarn的操作说明2. 对数据页指针(dp)的操作在直接寻址方式中,对数据存储器的寻址要在64 个字(即一个页面为64 个字) 的数据页中进行。由低4m字节的数据存储器组成65536 个数据也,用0-65535 进行标号。在 dp 直接寻址方式下,16 位的数据页指针 ( dp)包含了目前的数据页数。可以通过dp通过给 dp 赋新值去改变数据页号。具体操作说明看表6-13 。助记符说明mov dp, #10bit加载 10 位立即数到数据页指针movw d,p #19bit加载整个数据页movzdp,#10bit加载数据页并清除高位表 6-13 对 dp寄存器操作的说明3. 对堆栈指针sp的操作堆栈指针( sp)允许在数据存储器中使用软件堆栈。堆栈指针为16 位,可以对数据空间的低 64k 进行寻址。当使用sp 时,将 32 位地址的高16 位置为 0。复位后sp 指向地址00000400h。堆栈操作说明如下:1. 栈从低地址向高地址增长。2.p 总是指向堆栈中的下一个区域。3. sp 被初始化,它指向地址 00000400h。4. 将 32 位数值存入堆栈时,先存入低16 位,然后将高16 位存入下一个高地址中。5. 当读取 32 位的数值时,c28x 系列的 cpu期望存储器或外设接口逻辑把读写排成偶地址。例如,如果sp包含一个奇数地址00000083h,那么,进行一个32 位的读操作时,将从地址00000082h 和 00000083h 中读取数值。6. 如果增加sp 的值。如果他超过ffffh,或者减少sp的值,使它低于0000h 开始计数。例如,如果 sp=ffffh而一个指令又想 sp加 3,啫结果是 0001h。当减少 sp的值使它达到 0000h, 它就会重新从 ffffh 计数。例如,如果 sp=0002h而一个指令又从 sp 减 4,则结果就是 ffffh。 7 当数值存入堆栈是, sp并不要求排成奇数或者偶数地址。 排列由存储器或者外设接口逻辑完成。具体的语法操作说明看表 6-14 。助记符说明addb sp, #7bit7 位立即数加载堆栈指针pop acc堆栈内容弹出到寄存器accpop ar1: ar0堆栈内容弹出到寄存器ar1 和 ar0 pop ar1h: ar1h堆栈内容弹出到寄存器ar1h 和 ar1h pop dbgier堆栈内容弹出到寄存器dbfierpop dp: st1堆栈内容弹出到寄存器dp 和 st1pop dp堆栈内容弹出到寄存器dppop ifr堆栈内容弹出到寄存器ifrpop loc16堆栈内容弹出到loc16pop p堆栈内容弹出到寄存器ppop rpc堆栈内容弹出到寄存器rpcpop st0堆栈内容弹出到寄存器st0pop st1堆栈内容弹出到寄存器st1 pop t:st0堆栈内容弹出到寄存器t 和 st0 pop xt堆栈内容弹出到寄存器xtpop xarn堆栈内容弹出到辅助寄存器push acc寄存器 acc的内容入栈push arn: arm寄存器 arn和 arm的内容入栈push ar1h: ar0h 寄存器 ar1h和 ar0h的内容入栈push dbgier寄存器 dbgier的内容入栈push dp: st1寄存器 dp和 st1 的内容入栈push dp寄存器 dp的内容入栈push ifr寄存器 ifr 的内容入栈push loc16loc16入栈push p寄存器 p 的内容入栈push rpc寄存器 rpc的内容入栈push st0寄存器 st0 的内容入栈push st1寄存器 st1 的内容入栈push t:st0寄存器 t 和 st0 的内容入栈push xt寄存器 xt的内容入栈push xarn辅助寄存器的内容入栈subb sp, #7bit从堆栈指针中减去7 位立即数表 6-14 对 sp寄存器操作的说明4. 对 ax寄存器的操作在汇编语言程序中, 累加器 ax 是一个非常重要的寄存器, 但在程序中用它来保存临时数据时 , 最好将其转存到其它寄存器或内存单元中, 以防止在其它指令的执行过程中使其中的数据被修改, 从而得到不正确的结果, 为程序的调试带来不必要的麻烦。具体操作请看表6-15 。助记符说明add ax,loc16loc16加到 axadd loc16 , ax将 ax的内容与 loc16相加,并存储到loc16addb ax,#8bit将 8 位立即数累加到axand ax,loc16 , #16bit16 位立即数和 loc16逐位“与”,结果保存到ax andb ax,#8bitax与 8 位立即数(零扩展)逐位“与”asr ax,#( 1-16 )算术右移,移位次数由立即数决定asr ax,t算术右移,以为次数由t( 3:0 )的值决定cmp ax,loc16ax与loc16比较cmpb ax,#8bitax与 8 位立即数(零扩展)比较flip ax将 ax寄存器中的数据位翻转顺序lsl ax ,#( 1-16 )逻辑左移,移位次数由立即数决定lsl ax ,t逻辑左移,移位次数由t( 3:0 )的值决定lsr ax ,#( 1-16 )逻辑右移,移位次数由立即数决定lsr ax ,t逻辑右移,移位次数由t( 3:0 )的值决定max ax,loc16ax与loc16相比较求最大值,并保存到ax min ax ,loc16ax与loc16相比较求最小值,并保存到ax mov ax,loc16loc16加载到 axmov loc16 , ax寄 存 器 ax 保 存 到 loc16 mov loc6 , ax, cond有条件地把ax存储到 loc16movb ax,#8bit把 8 位立即数(零扩展)加载到axmovb ax,lsb, loc16加载 ax的低字节, ax 的高字节等于0x00 movb ax,msb, loc16加载 ax的高字节, ax 的低字节不变 movb loc16 , ax,lsb加载 ax的低字节movb loc16 , ax,msb加载 ax的高字节neg ax求 ax的相反数not ax求 ax的“非”or ax, loc16ax和loc16按位“或”,结果保存到ax or loc16 , axax和loc16按位“或”,结果保存到loc16orb ax,#8bitax和 8 位立即数(零扩展)按位“或”,结果保存到axsub ax,loc16从 ax中减去 loc16sub loc16 , axloc16减去 ax中的数据,结果存储到loc16subr loc16 , ax反向减法, ax中的数据减去loc16,结果存储到loc16 sxtb ax将 ax的低字节符号扩展到高字节xor ax,loc16ax和loc16按位“异或” ,结果保存到ax xor loc16, axax和loc16按位“异或” ,结果保存到loc16xorb ax,#8bitax与 8 位立即数(零扩展)逐位“异或”,结果保存到ax表 6-15 ax 寄存器操作说明5. 对 16 位 acc寄存器的操作累加器 (acc) 是 cpu的主要工作寄存器。除了那些对存储器和寄存器的直接操作外,所有的 alu操作结果最终都要送入acc。 acc支持单周期数据传送、加法、减法和来自数据存储器的宽度为32 位的比较运算, 它也可以接受32 位乘法操作的运算结果。对 acc可以单独进行 16 位 8 位的访问。累加器还具有如下的相关状态位。(1) 溢出模式位(ovm)(2) 符号扩展模式位(sxm)(3) 测试控制标志位(tc)(4) 进位位 (c)(5) 零标志位 (z)(6) 负标志位 (n)(7) 溢出标志位(v)(8) 溢出计数位(ovc)对于 acc寄存器的具体操作说明请看表6-16 16位 acc寄存器操作说明、表6-17 32位 acc寄存器操作说明和表6-18 64位 acc寄存器操作说明助记符说明add acc,loc16#0.16将loc移位后 ( 位扩展 ) 加到 accadd acc,#16bit#0.15将 16 位立即数移位后( 位扩展 ) 加到 accadd acc,loc16tloc16移位后 ( 位扩展 ) 加到 acc,移位次数由t(3:0) 决定addb acc,#8bit8 位立即数 ( 零扩展 ) 加到 accaddcu acc, loc16带进位加法,将无符号数loc16(零扩展 ) 加到 acc addu acc, loc16带无符号数 loc16(零扩展 ) 加到 accand acc,loc16将loc16(零扩展 ) 和 acc逐位“与”mov acc,loc16#0.16将loc移位后 ( 位扩展 ) 加载 accmov acc,#16bit#0.15将 16 位立即数移位后( 位扩展 ) 加载 accmov acc,loc16移位后 ( 位扩展 ) 加载 acc,移位次数由t(3:0) 决定movb acc, #8bit8 位立即数 ( 零扩展 ) 加载 acc movh loc16 , acc#1.8acc移位后高字节加载到loc16movu acc, #8bit将无符号数 loc16加载到 al,ah=0sub acc,loc16tacc减去 loc16 移位后 ( 位扩展 ) 的数据,结果保存到 acc sub acc,loc16#0.16acc减去 loc16 移位后 ( 位扩展 ) 的数据,结果保存到 ac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中医外科疾病辨治模拟测评答案及解析
- 2025年温州市瓯海区第三人民医院面向社会招聘工作人员5人笔试备考题库及答案解析
- 2026中国东方航空股份有限公司运行控制中心航务类招聘笔试参考题库附答案解析
- 2025年病理学实验室技术规范与质控考察模拟考试卷答案及解析
- 2025年内分泌科疾病诊治技巧考核模拟试卷答案及解析
- 2025广东梅州市蕉岭县蓝坊镇人民政府专职应急救援队员招聘1人笔试备考题库及答案解析
- 2025水利部牧区水利科学研究所招聘2人笔试备考题库及答案解析
- 2025农业农村部食物与营养发展研究所助理招聘3人笔试参考题库附答案解析
- 2025海南三亚航空旅游职业学院党群工作部部长、基建与采购处处长招聘笔试备考试题及答案解析
- 校园安全防范培训会课件
- 腾讯公司培训管理制度
- 徒步队安全管理制度
- 2025公需课《人工智能赋能制造业高质量发展》试题及答案
- 店铺转让分期协议书
- 呼吸机撤离与拔管流程标准化指南
- 国家职业技能标准 保育师
- 消防法律知识培训课件
- 小学生防电信诈骗课件
- 《玻璃纤维湿法制品》课件
- 朝花夕拾中父亲的病
- DB63T 2374-2024 微型消防站建设管理
评论
0/150
提交评论