DSP汇编语言程序的编写 (1)汇编语言源程序以asm为其扩展名。 (2)汇编语言源程序的每一行都可以由4个部分组成,句法如下: 标号|:助记符操作数b;注释 其中可用空格或TAB键隔开 标号一一供本程序的其他部分或其他程序调用。标号是任选项,标号后面可以加也可以不加 冒号“:”。标号必须从第一列写起,标号最多可达到32个字符(A~Z,a~z,0~9,, 以及$),但第1个字符不能以数字开头。引用标号时,标号的大小写必须一致。标号的值就 是SPC(段程序计数器)的值。如果不用标号,则第一个字符必须为空格、分号或星号(*) 助记符——助记符指令、汇编指令、宏指令和宏调用。作为助记符指令,一般用大写:汇编 命令和宏指令,以英文句号“.”开始,且为小写。汇编命令可以形成常数和变量,当用它 控制汇编和连接过程时,可以不占用存储空间。指令和汇编命令都不能写在第1列。 操作数——指令中的操作数或汇编命令中定义的内容。操作数之间必须用逗号“,”分开。 有的指令操作无操作数,如NOP、 RESET 注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行 或数行。注释是任选项。如果注释从第1列开始,也可以用“*”表示注释 (3) 常用的汇编命令如表所示 汇编命令 举例 titl 紧随其后的是汇编语言程序正文. title“ example.asm” d 结束汇编命令 放在汇编语言程序的最后 经汇编后,紧随.text后的是可执行程 紧随其后的是汇编语言程序正文 序代码 紧随其后的是己初始化数据 有两种数据形式:.int和.word int用来设置一个或多个16位无 nt ,1n 符号整型量常数 table word 6.8. 4 word用来设置一个或多个16位符 表示在程序存储器标号为 号整型量常数 tabe开始的8个单元中存放初始化数 据1,2, bssx,4表示在数据存储器中空出4 bs bss为未初始化变量保留存储空间 个存储单元存放变量x1,x2,x3和x4
1.DSP 汇编语言程序的编写 (1) 汇编语言源程序以.asm 为其扩展名。 (2) 汇编语言源程序的每一行都可以由 4 个部分组成,句法如下: [标号] [:] 助记符 [操作数] [;注释] 其中可用空格或 TAB 键隔开 标号——供本程序的其他部分或其他程序调用。标号是任选项,标号后面可以加也可以不加 冒号“:”。标号必须从第一列写起,标号最多可达到 32 个字符(A~Z ,a~z ,0~9 ,_ , 以及$),但第 1 个字符不能以数字开头。引用标号时,标号的大小写必须一致。标号的值就 是 SPC(段程序计数器)的值。如果不用标号,则第一个字符必须为空格、分号或星号(*)。 助记符——助记符指令、汇编指令、宏指令和宏调用。作为助记符指令,一般用大写;汇编 命令和宏指令,以英文句号“.”开始,且为小写。汇编命令可以形成常数和变量,当用它 控制汇编和连接过程时,可以不占用存储空间。指令和汇编命令都不能写在第 1 列。 操作数——指令中的操作数或汇编命令中定义的内容。操作数之间必须用逗号“,”分开。 有的指令操作无操作数,如 NOP、RESET。 注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行 或数行。注释是任选项。如果注释从第 1 列开始,也可以用“*”表示注释。 (3) 常用的汇编命令如表所示。 汇编命令 作用 举例 .title 紧随其后的是汇编语言程序正文 .title “example.asm” .end 结束汇编命令 放在汇编语言程序的最后 .text 紧随其后的是汇编语言程序正文 经汇编后,紧随.text 后的是可执行程 序代码 .data 紧随其后的是已初始化数据 有两种数据形式:.int 和.word .int .int 用来设置一个或多个 16 位无 符号整型量常数 .word .word 用来设置一个或多个16位符 号整型量常数 table: .word 1,2,3,4 .word 6,8,4,2 表 示 在 程 序 存 储 器 标 号 为 table 开始的 8 个单元中存放初始化数 据 1,2,3,4,6,8,4,2 .bss .bss 为未初始化变量保留存储空间 .bss x,4 表示在数据存储器中空出 4 个存储单元存放变量 x1,x2,x3 和 x4
.sect“ vectors”定义向量表,紧随 sec 建立包含代码和数据的自定义段其后的是复位向量和中断向量,名为 vectors STACK, sect TACK”,10h在数 为未初始化变量保留存储空间的自 use 据存储器中留出16个单元作为堆栈区 定义段 名为 STACK (4)汇编语言程序中的数据形式如表所示 形式 举例 进制 1110001b或1ll101B 八进制 226q或572Q 十进制 1234或+1234或-1234(缺省型) 十六进制 0A40h或0A40H或0xA40 浮点数 1.654e-23(仅C语言程序中能用,汇编程序中不能用) 字符 字符串 “ this is a strin 2 程序 2.1程序一 编程目的:了解DSP的输入和输出方法 程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4 title"mpy add.asm mmregs 将存储映像寄存器导入列表 STACK. sect "STACK".1Oh 给堆栈段分配空间 441 将9个字空间分配给各个变量 PAO set o ;将端口PA0全部置0 def start ;定义标号stat 定义数据代码段 word4.4.4.4 word4.4.4.4 text 定义文本代码段 start STM #.. SWWSR 将等待寄存器设为0,表示不等待
.sect 建立包含代码和数据的自定义段 .sect “vectors”定义向量表,紧随 其后的是复位向量和中断向量,名为 vectors .usect 为未初始化变量保留存储空间的自 定义段 STACK .usect “STACK”,10h 在数 据存储器中留出 16 个单元作为堆栈区, 名为 STACK (4) 汇编语言程序中的数据形式如表所示 形式 举例 二进制 1110001b 或 1111001B 八进制 226q 或 572Q 十进制 1234 或+1234 或-1234(缺省型) 十六进制 0A40h 或 0A40H 或 0xA40 浮点数 1.654e-23(仅 C 语言程序中能用,汇编程序中不能用) 字符 ‘D’ 字符串 “this is a string” 2. 程序 2.1 程序一 编程目的:了解 DSP 的输入和输出方法 程序功能:求乘积之和 y=a1*x1+a2*x2+a3*x3+a4*x4 .title "mpy_add.asm" .mmregs ;将存储映像寄存器导入列表 STACK .usect "STACK",10h ;给堆栈段分配空间 .bss a,4 ;将 9 个字空间分配给各个变量 .bss x,4 .bss y,1 PA0 .set 0 ;将端口 PA0 全部置 0 .def start ;定义标号 start .data ;定义数据代码段 table: .word 4,4,4,4 .word 4,4,4,4 .text ;定义文本代码段 start: STM #0,SWWSR ;将等待寄存器设为 0,表示不等待
STM #STACK+10h.s 设堆栈指针 STM #a ARl 将ARl指向变量a的地址 RPT 从程序存储空间转移7+1个值到数据储存空间 MVPD table. *ARl+ CALL SUM 调用SUM子程序 B 循环等待 SUM STM #a, AR3 ;将AR3指向变量a的地址 STM #X AR4 将AR4指向变量x的地址 RPTz A#3 将A清0,并重复执行下一条指令3+1次 MAC *AR3+*AR4+A ;将寄存器A中的低16位存入y地址空间 PORTW @y, PAO 将y地址中的值输出到输出口 RET ;子程序返回 ;程序结束 等待位的设置: C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。软件可 编程等待状态发生器可将外部总线周期延长多达7个周期,这样一来,C54x就能很方便的 与外部慢速器件相接口。如果外部器件要求插入7个以上的等待周期,则可以利用硬件 READY先来接口。当所有的外部寻址都配置在0等待状态时,加到等待状态发生器的时钟 被关断;来自内部时钟的这些通道被切断后,可以降低处理器的功耗 软件可编程等待状态发生器的工作由16位的软件等待状态寄存器( SWWSR)的控制, 它是存储器映象寄存器,在数据空间的地址为0028h。 将程序空间和数据空间都分成两个32K字块,IO空间由一个64K字块组成。这5个 字块空间在 SWWSR中都相应的有一个3位字段,用来定义各个空间插入等待状态的数目 14~12 l1~9 保留/PA 数据空间数据空间程序空间程序空间 I/O空间 (仅'C548 (高(低32(高32(低32 (64K) C549) 32K) 位) 位) 位) R/W R/W R/W 上述 SWWSR的各个3位字段规定的插入等待状态的最小数为0(不插入等待周期),最大 数为7(11b)。 2.2程序二 编程目的:熟悉DSP汇编程序设计技巧,完善输出功能
STM #STACK+10h,SP ;设堆栈指针 STM #a,AR1 ;将 AR1 指向变量 a 的地址 RPT #7 ;从程序存储空间转移 7+1 个值到数据储存空间 MVPD table,*AR1+ CALL SUM ;调用 SUM 子程序 end: B end ;循环等待 SUM: STM #a,AR3 ;将 AR3 指向变量 a 的地址 STM #x,AR4 ;将 AR4 指向变量 x 的地址 RPTZ A,#3 ;将 A 清 0,并重复执行下一条指令 3+1 次 MAC *AR3+,*AR4+,A STL A,@y ;将寄存器 A 中的低 16 位存入 y 地址空间 PORTW @y,PA0 ;将 y 地址中的值输出到输出口 RET ;子程序返回 .end ;程序结束 等待位的设置: C54x 片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。软件可 编程等待状态发生器可将外部总线周期延长多达 7 个周期,这样一来,’C54x 就能很方便的 与外部慢速器件相接口。如果外部器件要求插入 7 个以上的等待周期,则可以利用硬件 READY 先来接口。当所有的外部寻址都配置在 0 等待状态时,加到等待状态发生器的时钟 被关断;来自内部时钟的这些通道被切断后,可以降低处理器的功耗。 软件可编程等待状态发生器的工作由 16 位的软件等待状态寄存器(SWWSR)的控制, 它是存储器映象寄存器,在数据空间的地址为 0028h。 将程序空间和数据空间都分成两个 32K 字块,I/O 空间由一个 64K 字块组成。这 5 个 字块空间在 SWWSR 中都相应的有一个 3 位字段,用来定义各个空间插入等待状态的数目: 15 14~12 11~9 8~6 5~3 2~0 保留/XPA (仅’C548, ‘C549) I/O 空间 (64K) 数据空间 (高 32K) 数据空间 (低 32 位) 程序空间 (高 32 位) 程序空间 (低 32 位) R R/W R/W R/W R/W R/W 上述 SWWSR 的各个 3 位字段规定的插入等待状态的最小数为 0(不插入等待周期),最大 数为 7(111b)。 2.2 程序二 编程目的:熟悉 DSP 汇编程序设计技巧,完善输出功能
程序功能:实现一8位LED灯由左到右循环闪烁 itle"bubble. asm' 将存储映像寄存器导入列表 STACK sect" STACK",5h;给堆栈段分配空间 bss def start set start: STM #7000.SWWSR 设等待位 STM 将辅助寄存器AR3设为2(乘2,实现左移) STM #6.AR 将辅助寄存器AR1设为6(左移7次) STM #3.AR2 将辅助寄存器AR2设为3(循环执行4次) AR3. 将T(乘法寄存器)设为2 loop1: LD #l,A A寄存器值为1 STL y=1 PORTW @y, PAO 输出y地址内的值到输出口 STM #10000.AR4 将辅助寄存器AR4设为1000 oop3: RPT #10000 重复执行下一指令10000+1次 等待 BANZ loop, 'AR4- 循环AR4值10000+1次 loop2: MPY 将y×T,其值存入A寄存器 IL 将A的值存入y地址中 PORTW @y, PAO 输出y地址值到输出口 STM #10000AR5 将辅助寄存器AR5设为10000 loop4: RPT #10000 实现第8个灯跳转到第1个灯时的时间延迟 NOP BANz loop*AR5 BaNz loop2, * ARI end: B 数据寻址方式 C54x共有7种数据寻址方式,如表所示: 寻址方式 用途 举例 指令含义
程序功能:实现一 8 位 LED 灯由左到右循环闪烁 .title"bubble.asm" .mmregs ;将存储映像寄存器导入列表 STACK .usect "STACK",5h ;给堆栈段分配空间 .bss y,1 .def start .data PA0 .set 0 .text start: STM #7000,SWWSR ;设等待位 STM #2,AR3 ;将辅助寄存器 AR3 设为 2 (乘 2,实现左移) STM #6,AR1 ;将辅助寄存器 AR1 设为 6 (左移 7 次) STM #3,AR2 ;将辅助寄存器 AR2 设为 3 (循环执行 4 次) LD AR3,T ;将 T(乘法寄存器)设为 2 loop1: LD #1,A ;A 寄存器值为 1 STL A,@y ;y=1 PORTW @y,PA0 ;输出 y 地址内的值到输出口 STM #10000,AR4 ;将辅助寄存器 AR4 设为 10000 loop3: RPT #10000 ;重复执行下一指令 10000+1 次 NOP ;等待 BANZ loop3,*AR4- ;循环 AR4 值 10000+1 次 loop2: MPY @y,A ;将 y×T,其值存入 A 寄存器 STL A,@y ;将 A 的值存入 y 地址中 PORTW @y,PA0 ;输出 y 地址值到输出口 STM #10000,AR5 ;将辅助寄存器 AR5 设为 10000 loop4: RPT #10000 ;实现第 8 个灯跳转到第 1 个灯时的时间延迟 NOP BANZ loop4,*AR5- BANZ loop2,*AR1- BANZ loop1,*AR2- end: B end .end 数据寻址方式: C54x 共有 7 种数据寻址方式,如表所示: 寻址方式 用途 举例 指令含义
立即寻址 主要用于初始化LD#10, 将立即数10传送至 累加器A 绝对寻址 利用16位地址寻址SnA,+(y) 将累加器A的低 存储单元 位存放到变量y所在 的存储单元中 累加器寻址 把累加器的内容作为 READYA X 按累加器A作为地址 地址 读程序存储器,并存 入变量x所在的数据 存储器单元 直接寻址 利用数据页指针和堆LD@xA (DP+x的低7位地址) 栈指针寻址 →>A 间接寻址 利用辅助寄存器作为LD*AR1,A (ARl))——>A 地址指针 存储器映象寄存器寻快速寻址存储器映象| LDM STI,B (ST1) 寄存器 堆栈寻址 压入弹出数据存储| PSHM AG 器和MMR(存储器 (AG)——>TOS 映象寄存器) C54x寻址存储器有两种基本的数据形式:16位数和32位数。大多数指令能够寻址 16位数,但是,只有双精度和长字指令才能寻址32位数 在32位寻址时,先处理高有效字,然后处理低有效字。如果寻址的第1个字处在偶地 址,那么第2个字就处在下一个(较高的)地址;如果第1个字处在奇地址,那么第2个 字就处在前一个(较低的)地址。 循环操作:BANZ 在程序设计时,经常需要重复执行某一段程序。利用BANZ(当辅助寄存器部位0 时转移)指令执行循环技术和操作是十分方便的。如果要重复执行n次,则重复指令中应规 定计数值为n-1次。 重复操作: C54x有3条重复操作指令:RPT(重复下条指令)、RPIZ(累加器清0并重复下条指 令)以及RPIB(块重复指令) 重复指令RPT或RPIZ允许重复执行紧随其后的那一条指令。如果要重复执行n次 则重复指令中应规定计数值为n-1次
立即寻址 主要用于初始化 LD #10,A 将立即数 10 传送至 累加器 A 绝对寻址 利用 16 位地址寻址 存储单元 STL A,*(y) 将累加器 A 的低 16 位存放到变量 y 所在 的存储单元中 累加器寻址 把累加器的内容作为 地址 READYA x 按累加器 A 作为地址 读程序存储器,并存 入变量 x 所在的数据 存储器单元 直接寻址 利用数据页指针和堆 栈指针寻址 LD @x,A (DP+x 的低 7 位地址) ——>A 间接寻址 利用辅助寄存器作为 地址指针 LD *AR1,A ((AR1)) ——>A 存储器映象寄存器寻 址 快速寻址存储器映象 寄存器 LDM ST1,B (ST1)——>B 堆栈寻址 压入/弹出数据存储 器和 MMR(存储器 映象寄存器) PSHM AG (SP)-1——>SP, (AG)——>TOS ‘C54x 寻址存储器有两种基本的数据形式:16 位数和 32 位数。大多数指令能够寻址 16 位数,但是,只有双精度和长字指令才能寻址 32 位数。 在 32 位寻址时,先处理高有效字,然后处理低有效字。如果寻址的第 1 个字处在偶地 址,那么第 2 个字就处在下一个(较高的)地址;如果第 1 个字处在奇地址,那么第 2 个 字就处在前一个(较低的)地址。 循环操作:BANZ 在程序设计时,经常需要重复执行某一段程序。利用 BANZ(当辅助寄存器部位 0 时转移)指令执行循环技术和操作是十分方便的。如果要重复执行 n 次,则重复指令中应规 定计数值为 n-1 次。 重复操作: C54x 有 3 条重复操作指令:RPT(重复下条指令)、RPTZ(累加器清 0 并重复下条指 令)以及 RPTB(块重复指令)。 重复指令 RPT 或 RPTZ 允许重复执行紧随其后的那一条指令。如果要重复执行 n 次, 则重复指令中应规定计数值为 n-1 次
2.3程序三 编程目的:实现DSP分时输入与输出功能 程序功能:先从一个1O口读入一数据并将其存入某地址,再从该地址将数据输出到另一个 /O口 title"spio.asm set set STACK sect "STACK".10h text start: PORTR PAI,ay;从IO口读入数据并储存到y所在的地址 LD @y,A;将y中的数据写入累加器A中(便于观察y中数值的变化情况) PORTWay,PA0:将y所在地址中的数据输出到IO口 B end end 24程序四 编程目的:实现DSP循环输入与输出功能 程序功能:令DSP反复执行从输入装置读取数据,并将数据存入某一地址,再从该地址将 数据输出到输出设备 titl PAO set 0 PAI STACK usect "STACK".10h text STM #4000.AR ;ARI作循环计数器 LOOP1 PORTR PAL, @y 循环读写 PORTW @y, PAO BANZ LOOP1.*ARI
2.3 程序三 编程目的:实现 DSP 分时输入与输出功能 程序功能:先从一个 I/O 口读入一数据并将其存入某地址,再从该地址将数据输出到另一个 I/O 口 .title "dspio.asm" .mmregs PA0 .set 0 PA1 .set 1 STACK .usect "STACK",10h .bss y,1 .text start: PORTR PA1,@y ;从 I/O 口读入数据并储存到 y 所在的地址 LD @y,A ;将 y 中的数据写入累加器 A 中(便于观察 y 中数值的变化情况) PORTW @y,PA0 ;将 y 所在地址中的数据输出到 I/O 口 end: B end .end 2.4 程序四 编程目的:实现 DSP 循环输入与输出功能 程序功能:令 DSP 反复执行从输入装置读取数据,并将数据存入某一地址,再从该地址将 数据输出到输出设备 .title "dspio2.asm" .mmregs PA0 .set 0 PA1 .set 1 STACK .usect "STACK",10h .bss y,1 .text start: STM #4000,AR1 ;AR1 作循环计数器 LOOP1: PORTR PA1,@y ;循环读写 LD @y,A PORTW @y,PA0 BANZ LOOP1,*AR1
d 25程序五 编程目的:应用DSP实现对压水堆大破口事故(LOCA)进行事故后果判断 编程背景:当始发事件大LOCA发生时,需要下列功能响应以消除或缓解事故: (1)停堆(RS),中止核裂变过程 (2)安全壳喷淋系统动作,以降低安全壳压力(COL: (3)向堆芯注入应急冷却水(ECI),以冷却堆芯 (4)安全壳再循环冷却(COR),由循环喷淋水导出安全壳内热量,控制安 全壳的温度核压力 (5)堆芯再循环冷却(ECR),进行堆芯再循环冷却阶段 功能事件树图如下图所示 破口堆次临界安全壳降堆芯应急完全壳降压堆芯再循序列号堆芯是 压COI 冷却 ECICOR 环冷却 否熔化 ECR 程序功能:反复从输入口读取数据(不同位分别代表执行不同的功能响应),经DSP处理后 将判断结果输出到输出口,通过指示灯(不同的灯代表不同事故结果)显示出来 title"LOCA. asm mmregs PAl STACK usect "STACK.10h bss v 1 def start word0,128,0,128,0,32,0,320,128,0 事故分析列表 word128,0,32,0,32,0,0,0,0,0 rd4,0,4,0.,0,0,0,04,0 word4,0,0,0,0,0,0,0,0,0
end: B end .end 2.5 程序五 编程目的:应用 DSP 实现对压水堆大破口事故(LOCA)进行事故后果判断 编程背景:当始发事件大 LOCA 发生时,需要下列功能响应以消除或缓解事故: (1) 停堆(RS),中止核裂变过程; (2) 安全壳喷淋系统动作,以降低安全壳压力(COI); (3) 向堆芯注入应急冷却水(ECI),以冷却堆芯; (4) 安全壳再循环冷却(COR),由循环喷淋水导出安全壳内热量,控制安 全壳的温度核压力; (5) 堆芯再循环冷却(ECR),进行堆芯再循环冷却阶段。 功能事件树图如下图所示 破 口 PB 堆次临界 RS 安全壳降 压 COI 堆芯应急 冷却 ECI 完全壳降压 COR 堆芯再 循 环冷却 ECR 序列号 堆芯是 否熔化 程序功能:反复从输入口读取数据(不同位分别代表执行不同的功能响应),经 DSP 处理后 将判断结果输出到输出口,通过指示灯(不同的灯代表不同事故结果)显示出来 .title "LOCA.asm" .mmregs PA0 .set 0 PA1 .set 1 STACK .usect "STACK",10h .bss y,1 .bss x,1 .def start .data table: .word 0,128,0,128,0,32,0,32,0,128,0 ;事故分析列表 .word 128,0,32,0,32,0,0,0,0,0 .word 4,0,4,0,0,0,0,0,4,0 .word 4,0,0,0,0,0,0,0,0,0
0,0,0,0.0,0.0,0,0 word0,0,2,0,2,0,0,0,0,0 word2,0,2,0,0,0,0,0,0,0 d0,0,0,0,0,0,0,0,0,0 word0.0,0,0,0,0,0,0,0,0 word0,0,0,0,.0,0,0,0,0,0 word16,0,16,0,0,0,00,16,0 ,0,0,0,0,0,1,0,1, word0,0,0,0,1,0,1,0,0,0 word0,0,0,0.0,0,0,0.0,0 word0,0,0,0.0,0,0,0,0,0 word0,0,0,0,0,0,0,0,0,0 word0,0,0,0,0,0,0,0,0,0 word0.0,0,0,0,0,0,0,0,0 ord0,0,0,0,0,0,0,0,0,0 word0,0,0,0,0,0,0,0,0,0 word0,0,0,0,0,0,0,0,8,0 word64,0,64,0,0,0,0,064.0 word64,0,0,0,0,0,0,0,0,0 start STM #L.ARI 将AR1置1 STM #table. AR2 将标号 table的地址赋给 将AR3置1 PORTR PAO, ay 循环从输入口写入数据到 y所在的地址 Ld @y, B 将y地址中的值写入B 寄存器(便于查看y的值 AReA 将 table的地址写入A ADD @y, A 将 table的地址与读入的 数据相加,结果存入A 将A的低16位存入AR3
.word 0,0,0,0,0,0,0,0,0,0 .word 0,0,2,0,2,0,0,0,0,0 .word 2,0,2,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 16,0,16,0,0,0,0,0,16,0 .word 16,0,0,0,0,0,1,0,1,0 .word 0,0,0,0,1,0,1,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,8,0 .word 8,0,0,0,0,0,8,0,8,0 .word 64,0,64,0,0,0,0,0,64,0 .word 64,0,0,0,0,0,0,0,0,0 .text start: STM #1,AR1 ;将 AR1 置 1 STM #table,AR2 ;将标号 table 的地址赋给 ;AR2 STM #1,AR3 ;将 AR3 置 1 LOOP1: PORTR PA0,@y ;循环从输入口写入数据到 ;y 所在的地址 LD @y,B ;将 y 地址中的值写入 B ;寄存器(便于查看 y 的值) LD @AR2,A ;将 table 的地址写入 A ADD @y,A ;将 table 的地址与读入的 ;数据相加,结果存入 A STL A,@AR3 ;将 A 的低 16 位存入 AR3