寻址方式、指令系统和汇编伪操作 姓名:邓陟 学号:2009011976 实验班号:13 机器号:A65(A13) 一、 实验目的 1. 学习 MSP430 的寻址方式和指令系统 2. 了解计算机取指令、执行指令的工作过程 3. 掌握 DEBUG 下的运行命令、调试程序的方法 4. 掌握常用汇编伪操作(指示性语句) 二、 实验基本任务 1. 学习寻址方式和指令系统 运行 EW430,新建一个汇编语言建立项目 Lab_3,编写下面 L3_task1.s43,添加到项 目 Lab_3 中, 移出项目自带的 asm.s43, 编译连接后,在 DEBUG 下单步执行程序, 回答:下面各条指令采用了哪些寻址方式?程序的功能是什么?如何查看程序执行 的结果? L3_task1.s43 程序清单 #include “msp430.h“ ORG 0FFFEh DC16 main ORG 1100H main: MOV #0A00h, SP ;初始化 SP,此句不能删除 MOV.W #5A80h,关闭看门狗,避免定时自动复位,此句不能删除 MOV #300h, R14 MOV #0, R15 MOV #6, R13 next: ADD.B @R14, R15 INC R14 DEC R13 JNZ next MOV.B R15, 0(R14) exit: JMP exit END 表 1 指令寻址方式 指令 寻址方式 MOV #300h, R14 立即数寻址 寄存器寻址 MOV #0, R15 立即数寻址 寄存器寻址 MOV #6, R13 立即数寻址 寄存器寻址 ADD.B @R14, R15 寄存器间接寻址 寄存器寻址 INC R14 寄存器寻址 DEC R13 寄存器寻址 JNZ next 符号地址寻址 MOV.B R15, 0(R14) 寄存器相对寻址 JMP exit 符号地址寻址 程序的功能是将 300h 为首地址的 6 个字节存储器单元内容相加, 结果放在 306h 存 储器单元中。
程序执行的结果可在 memory 中查看 按下面方式完成操作: 1) 先用 view 中的 memory 操作将 300h 开始的 8 个内存单元内容顺序修改为十六 进制的 11,12,13,14,15,16,17,18,19,1a; 2) 用单步执行命令 step over(F10)执行一遍程序, 注意观察每条指令执行后的结果, 含相关寄存器和存储单元的变化; 表 2 指令执行结果 指令 执行后的结果 MOV #300h, R14 R14=0x0300 MOV #0, R15 R15=0x0000 MOV #6, R13 R13=0x0006 ADD.B @R14, R15 R15=0x0011 INC R14 R14=0x0301 DEC R13 R13=0x0005 JNZ next ADD.B @R14, R15 R15=0x0023 INC R14 R14=0x0302 DEC R13 R13=0x0004 JNZ next ADD.B @R14, R15 R15=0x0036 INC R14 R14=0x0303 DEC R13 R13=0x0003 JNZ next ADD.B @R14, R15 R15=0x004A INC R14 R14=0x0304 DEC R13 R13=0x0002 JNZ next ADD.B @R14, R15 R15=0x005F INC R14 R14=0x0305 DEC R13 R13=0x0001 JNZ next ADD.B @R14, R15 R15=0x0075 INC R14 R14=0x0306 DEC R13 R13=0x0000 JNZ next SR=0x0003 Z=1 MOV.B R15, 0(R14) 0x0306=0x75 JMP exit 3) 复位程序,分别在 JNZ next、exit 语句前设置一个断点,用连续执行命令 Go(F5) 执行程序,观察每次执行后的结果。
表 3 执行后结果 SR=0x0001 R13=0x0005 R14=0x0301 R15=0x0011 SR=0x0001 R13=0x0004 R14=0x0302 R15=0x0023 SR=0x0001 R13=0x0003 R14=0x0303 R15=0x0036 SR=0x0001 R13=0x0002 R14=0x0304 R15=0x004A SR=0x0001 R13=0x0001 R14=0x0305 R15=0x005F SR=0x0003 R13=0x0000 R14=0x0306 R15=0x0075 0x0306=0x75 4) 如果将程序中的 ADD.B @R14,R15 和 INC R14 两条语句改为一条 ADD.B @R14+,R15 语句,采用了什么寻址方式?程序执行的功能是否改变? 采用了寄存器间接增量寻址程序执行的功能不改变 5) 在 4)的基础上将程序中的 ADD.B @R14+,R15 改为 ADD.W @R14+,R15,将 MOV.B R15, 0(R14)改为 MOV.W R15, 0(R14),重新执行程序,执行的结果有什么不同? 执行的结果是将 300h 为首地址的 6 个字存储器单元内容相加,结果放在 30Ch 存储器单元中。
6) 如果程序中的 INC R4 写成了 INC.B R4,执行的结果一样吗?为什么? 不一样因为 INC.B R4 会使 R4 中高字节内容清零 2. 调试程序练习 程序 L3_task2.s43 功能是向端口 2(地址为此句不能删除 ORG 0FFFEh ;此句不能删除 DW main ;此句不能删除 ORG 1100H ;此句不能删除 main: MOV #0A00h, SP ;此句不能删除,初始化 SP, MOV.W #5A80h, 此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0xFF, 设置端口 2 为输出端口 MOV.b 0xFF, 置端口 2 初值为 0xff,发光二极管应全灭 next: INV.b 将端口 2 的数据求反后再输出 CALL delay ;调用延时子程 JMP next delay: ;延时子程 MOV #3, R14 ww: DEC R14 JNZ ww RET END ;此句不能删除 将语句 MOV.b 0xFF, module name PUBLIC main ; make the main label vissible ORG 0FFFEh DC16 init ; set reset vector to 'init' label #define number4 0x90 RSEG DATA16_C ;常量数据段 number1 DB 0x0a,0x0b,'a','b' ;DB 字节类型定义 number2 DW 0x3412,0x7856,0xBC9A,0x0FDE ;DW 字类型定义 string DB 'One World, One Dream' ;DB 字符串定义 stringend DB 'E' RSEG DATA16_N ;未初始化数据段 buffer DS8 stringend-string ;字节型缓冲区定义 RSEG CSTACK ;堆栈段 RSEG CODE ;代码段 init: MOV #SFE(CSTACK), SP ;SFE 取段尾,初始化 SP,此句不能删除 main: MOV.W #5A80h,关闭看门狗,此句不能删除 MOV #SIZEOF(CSTACK), R4 ;SIZEOF 取段长度 MOV #SFB(DATA16_N),R6 ;SFB 取段起始地址 MOV #number4, R7 ;define 定义的符号常量 MOV.B number1, R9 ;传送存储单元内容到寄存器中 MOV.w number2, R12 ;传送字变量内容到寄存器中 MOV.B R9, buffer ;将寄存器内容存到存储单元中 MOV #buffer, R11 ;取存储单元 buffer 地址 MOV.B @R10, 0(R11) ;存储单元内容传送 MOV.B number1, 0(R11) ;存储单元内容传送 MOV #stringend-string,R13 ;利用两地址差值计算串长度 JMP $ ;汇编程序地址计算器$ END 1) 利用EW430下的view/memory查看DATA16_C段中定义的存储单元内容和地址。
表 4 存储单元符号、地址和内容 符号 地址 内容 number1 1136 0A 1137 0B 1138 61 1139 62 number2 113A 12 113B 34 113C 56 113D 78 113E 9A 113F BC 1140 DE 1141 F0 string 1142 4F 1143 6E 1144 65 1145 20 1146 57 1147 6F 1148 72 1149 6C 114A 64 114B 2C 114C 20 114D 4F 114E 6E 114F 65 1150 20 1151 44 1152 72 1153 65 1154 61 1155 6D stringend 1156 45 1157 00 2) 在 L3_directives.s43 中,number4 和 number1 分别被定义成了什么?二者有何 不同?#number4和#number1这两个操作有何不同?MOV #number4, R7和MOV number4, R7 执行的结果会相同吗?为什么? number4 被定义成常量而 number1 被定义成字节类型变量。
number4 取常量 number4 作为立即数,而#number1 取 number1 的地址作为立即数MOV #number4, R7 和 MOV number4, R7 执行的结果不相同 因为#number4 是立即数寻址而 number4 是符号地址寻址 三、 已完成的选做任务 5. 理解 CPU 对存储器进行字操作遵循的“对准偶地址”原则 在 430 单片机中,当向存储器进行一个字节的读/写操作时,对存储器单元的地址 没有奇、偶的限制;当向存储器进行一个字的读/写操作时,要求从偶地址开始。