资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验 4 汇编语言程序设计姓名:吴国溧 学号:2009011609 机器号:07一、 实验目的1. 掌握汇编语言项目上机过程2. 掌握汇编语言程序结构3. 掌握汇编语言指示性语句4. 掌握汇编语言程序设计和调试方法5. 掌握 MSP430F1xx 基本 I/O 控制方法二、实验基本任务1、学习汇编指示性语句课本上给出的 L4_directives.s43 程序如下1) 定义一个存放在 RAM 中的变量 :RSEG DATA16_N ;未初始化数据段buffer DS8 stringend-string ;字节型缓冲区定义使用该变量:MOV #buffer, R11#buffer 是取用其地址,若换为 buffer 是取用该地址里面的内容定义一个存放在 ROM 的常量:RSEG DATA16_C ;常量数据段number1 DB 0x0a,0x0b,a,b ;DB 字节类型定义number2 DW 0x3412,0x7856,0xBC9A,0x0FDE ;DW 字类型定义使用该变量:MOV.B number1, R9 ;传送存储单元内容到寄存器中直接写 number1 是取用其内容;若用#number1 则是取用其地址。2) 在程序中,number4 被定义成符号常量,number1 被定义成常量数据段。它们的区别在于,number4 等于它被定义的内容,number1 是数据段的名称。#number4 是指把该常量当做立即数,#number1 是指取该数据段的首地址。MOV #number4, R7和MOV number4, R7 执行的结果不相同,因为前者是把number4当做立即数赋给了R7,而后者是将number4当做地址,并把该地址中的内容赋给R7.2、控制发光二极管的显示变化程序框图如下:(省略了延时部分)开始两种规律对应的十六进制定义到常量数据段R 4 记录读取数据的位置 ,R 5 记录读取次数R 4 所指向存储单元内容赋给 P 2 O U T , 灯亮根据 R 5 判断是否读到数据段最后一个数R 4 指向下一个数 , R 5 减一重置 R 4 , R 5 的值 NY程序代码如下:#include msp430.h ; #define controlled include fileNAME main ; module namePUBLIC main ; make the main label vissible; outside this moduleORG 0FFFEhDC16 init ; set reset vector to init labelRSEG DATA16_CLEDdata:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,07EH,0BDH,0DBH,0E7H;常量数据段RSEG CSTACK ; pre-declaration of segmentRSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main programMOV.W #WDTPW+WDTHOLD, Stop watchdog timerMOV.B #0,&P2SELMOV.B #0FFH,&P2DIRMOV.B #0FFH,设置P2端口为基本/输出型端口,并初始灯灭again: MOV #LEDdata,R4 ;R4存储数据段首地址MOV #12,R5 ;R5存储数据段数据个数next: MOV.B R4+,控制灯的亮灭,寄存器间接增量寻址CALL #delay DEC R5JNZ next ;取下一个数据JMP again ;重复上述过程delay PUSH SR ;延时子程序MOV #0FFFFH,R6wait: DEC R6JNZ waitPOP SRRET END思考:将二极管的 8 个引脚 P4 的 8 个端口引脚分别相连即可。编程只需把上面程序中 P2改为 P4.3、用按键控制发光二极管的显示变化程序框图如下:开始两种规律对应的十六进制定义到常量数据段R 4 指向规律 1 数据首地址 ; R 5 指向规律 2 首地址检测是否按下K 1显示 R 4 内容并延时YR 4 是否指向规律 1 最后一个数N重置 R 4 Y检测是否按下K 2显示 R 5 内容并延时R 5 是否指向规律 2 最后一个数重置 R 5NYY程序代码如下:#include msp430.h ; #define controlled include fileNAME main ; module namePUBLIC main ; make the main label vissible; outside this moduleORG 0FFFEhDC16 init ; set reset vector to init label RSEG DATA16_CLEDtab: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,07EH,0BDH,0DBH,0E7HRSEG CSTACK ; pre-declaration of segmentRSEG CODE ; place program in CODE segmentinit: MOV #SFE(CSTACK), SP ; set up stackmain: NOP ; main programMOV.W #WDTPW+WDTHOLD, Stop watchdog timer MOV.B #0,&P2SELMOV.B #0FFH,&P2OUTMOV.B #0FFH,定义P2端口为基本/输出端口,初始灯灭BIC.B #BIT0+BIT1,&P1SELBIC.B #BIT0+BIT1,定义P1.0 P1.1引脚端口为基本/输入端口MOV #LEDtab-1,R4MOV #LEDtab+7,R5 ;R4读取规律1,R5读取规律2k1: BIT.B #BIT0,检测是否按下K1JNZ k2 ;未按下,检测K2INC R4 ;按下,R4指向下一数据CMP #LEDtab+8,R4 ;检测R4是否指向最后一个数(规律1的)JNZ blink1 ;去显示R4内容MOV #LEDtab,R4 ;重置R4JMP blink1 ;去显示k2: BIT.B #BIT1,检测是否按下K2 JNZ k1 ;未按下,检测K1INC R5 ;R5指向下个数据CMP #LEDtab+12,R5 ;检测R5是否指向最后一个数(规律2的)JNZ blink2 ;去显示MOV #LEDtab+8,R5 ;重置R5JMP blink2 ;去显示 blink1: MOV.B R4,&P2OUTCALL #delayJMP k1 blink2: MOV.B R5,&P2OUTCALL #delayJMP k2 delay PUSH SR ;延时子程序MOV #0FFFFH,R6 wait: DEC R6JNZ waitPOP SRRET END思考:程序的代码段存储在内存的 FLASH 区域,其起始地址为 1100。正常状态下 1100 将存储在 memory 的 0XFFFE-0XFFFF 中。利用 ORG 0XFFFE 和 DC16 init两条语句可以把程序起始地址赋给中断向量表的 0XFFFE-0XFFFF 单元,每次开机上电后,系统都会从中断向量表中读取代码起始地址并从这个地址开始执行。如去除这两句指令,则会在取址时发生异常。4、 (选做)了解.xcl 配置文件的作用回答:在 L4_directives.s43 中,查得:/ CODE 1100-FFDF Program code/ DATA16_C 1100-FFDF Constant const variables AND String literals/ DATA16_I 0200-09FF Initialized variables/ DATA16_Z 0200-09FF Zero initialized variables/ DATA16_N 0200-09FF Uninitialized variables/ CSTACK 0200-09FF Run-time stack/auto variables5、 (选做)了解汇编程序、连接程序功能得到的.lst 文件如下# # IAR Systems MSP430 Assembler V3.42A/W32 03/Nov/2012 23:14:47 # Copyright 1996-2006 IAR Systems. All rights reserved. #
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号