计算机硬件基础实验报告2汇编语言程序结构汇编语言程序设计.docx
- 文档编号:6432907
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:15
- 大小:21.90KB
计算机硬件基础实验报告2汇编语言程序结构汇编语言程序设计.docx
《计算机硬件基础实验报告2汇编语言程序结构汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《计算机硬件基础实验报告2汇编语言程序结构汇编语言程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
计算机硬件基础实验报告2汇编语言程序结构汇编语言程序设计
实验4.汇编语言程序结构
姓名孙叶城学号2011011700实验班号33机器号35
一、实验目的
1.掌握汇编语言项目上机过程
2.掌握汇编语言程序结构
3.掌握汇编语言指示性语句
4.掌握汇编语言程序设计和调试方法
5.掌握MSP430F1xx基本I/O控制方法
二、实验任务
1.学习汇编指示性语句(可在simulator下完成)
1)如何定义一个存放在RAM中的变量、如何应用该变量,如何定义一个存放在ROM的常量、如何用该常量?
可定义在RAM中的未初始化数据段DATA16_N,再按需要定义缓冲区。
使用时可通过类似C语言中使用数组中的元素的方式使用。
如name(XX)。
定义常量可用“#definenameXXXX”的语句定义。
使用时把立即数对等成name即可。
2)在L4_directives.s43中,number4和number1分别被定义成了什么?
二者有何不同?
#number4和#number1这两个操作有何不同?
MOV#number4,R7和MOVnumber4,R7执行的结果会相同吗?
为什么?
number4被定义成常量,而number1被定义成初始化的变量数组。
#number4相当于立即数寻址,而#number1是取数组的首地址。
结果不同,MOV#number4,R7是把0x90给R7,而MOVnumber4,R7是把一个随机数给了R7,这相当于是立即数寻址的错误操作。
2.控制发光二极管的显示变化
在设计实验板上发光二极管与单片机的连线,编写一个小程序控制8个发光二极管按下面的2种规律循环显示,即规律1规律2规律1规律2……,如此反复。
1)规律1:
8个LED灯逆时针一个一个单独点亮,即L1亮L2……L7亮L8亮,每次只有一个灯亮,其他灯灭;
2)规律2:
8个LED灯两两点亮,顺序为L1和L8,L2和L7,L3和L6,L4和L5,每次只有两个灯亮,其他灯灭;
注意:
在灯的状态变化中,需留一定延时,以便视觉能感受到灯的亮灭,要求编写一延时子程,需要延时的地方,用CALL指令调用该延时子程。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGDATA16_C
LEDtab1:
DB0FEh,0FDh,0FBh,0F7h,0EFh,0DFh,0BFh,07Fh
LEDtab2:
DB07Eh,0BDh,0DBh,0E7h
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
MOV.b#0h,&P2SEL
MOV.b#0FFh,&P2OUT
MOV.b#0FFh,&P2DIR
start:
MOV#8,R4
MOV#4,R5
MOV#0,R6
num1:
MOV.bLEDtab1(R6),&P2OUT
CALL#delay
INCR6
DECR4
JNZnum1
num2:
MOV.bLEDtab2(R4),&P2OUT
CALL#delay
INCR4
DECR5
JNZnum2
JMPstart
delay:
MOV#0FFFFh,R7
ww:
DECR7
JNZww
RET
END
思考:
如果选择用单片机的P4端口控制8个发光二极管,如何在实验板上设计连线?
如何编程实现任务2的功能?
把P4的8个接口分别与二极管的8个接口用跳线连接,程序中把P2XXX换成P4XXX。
3.用按键控制发光二极管的显示变化
在任务2基础上,增加2个按键与单片机的引脚相连,编程实现由按键控制发光二级管的显示变化:
当按下实验板上的Key1键时,8个发光二极管按任务2中的规律1反复变化,当按下实验板上的Key2键时,8个发光二极管按任务2中的规律2反复变化。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGDATA16_C
LEDtab1:
DB0FEh,0FDh,0FBh,0F7h,0EFh,0DFh,0BFh,07Fh
LEDtab2:
DB07Eh,0BDh,0DBh,0E7h
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
MOV.b#0h,&P2SEL
MOV.b#0FFh,&P2OUT
MOV.b#0FFh,&P2DIR
BIC.b#BIT0+BIT1,&P1SEL
BIC.b#BIT0+BIT1,&P1DIR
MOV#0,R8
start:
MOV#8,R4
MOV#4,R5
MOV#0,R6
k1:
BIT.b#BIT0,&P1IN
JNZk2
MOV.b#1,R8
JMPkk1
k2:
BIT.b#BIT1,&P1IN
JNZkk1
MOV.b#2,R8
JMPkk2
kk1:
CMP.b#1,R8
JNZkk2
MOV.bLEDtab1(R6),&P2OUT
CALL#delay
INCR6
DECR4
JNZkk1
JMPstart
kk2:
CMP.b#2,R8
JNZk1
MOV.bLEDtab2(R6),&P2OUT
CALL#delay
INCR6
DECR5
JNZkk2
JMPstart
delay:
MOV#0FFFFh,R7
ww:
DECR7
JNZww
RET
END
思考:
1)程序开头的ORG0xFFFE和DC16init这两条语句的作用是什么?
在这两条语句的行首加注释符“;”(相当于删除了这两条语句),即这两条语句不起作用,操作EW430左上角的reset,重新执行程序,出现什么后果,为什么?
因为EW430上电复位后从0xFFFE~0xFFFF上取第一条指令的地址,所以这两条语句是把init的地址1100h放在0xFFFE~0xFFFF上。
注释掉这两条语句后,重新执行程序,出现“Usererror:
Illegalopcodefoundonaddress0x0”
因为注释掉后,EW430从0xFFFE~0xFFFF上取第一条指令的地址“0x0”开始执行,而0x0上没有命令,所以出错了。
2)如果选择用单片机的P5端口接收2个按键的输入信号,如何在实验板上设计连线?
如何编程实现任务3中的功能?
把实验板上的Key1、2键和P5.0,P5.1用跳线连接,再把P1XXX换成P5XXX。
三、已完成的选做任务
4.(选做,可在simulator下完成)了解.xcl配置文件的作用
在任务1的基础上,打开lnk430F149.xcl配置文件,了解EW430系统设置的DATA16_I,DATA16_Z,DATA16_N,CSTACK,DATA16_ID,DATA16_C,CODE等段的定义及其属性,请记录各符号段对应的存储器地址。
段名
DATA16_I
DATA16_Z
DATA16_N
CSTACK
DATA16_ID
DATA16_C
CODE
起始地址
0200h
0200h
0200h
09B0h
1100h
1100h
1100h
末地址
09FFh
09FFh
09FFh
0A00h
FFDFh
FFDFh
FFDFh
回答:
在L4_directives.s43中,DATA16_C、DATA16_N、CSTACK、CODE各段的首、末地址分别是多少?
段名
DATA16_C
DATA16_N
CSTACK
CODE
起始地址
1100h
0200h
09B0h
1122h
末地址
1120h
0207h
0A00h
1157h
5.(选做,可在simulator下完成)了解汇编程序、连接程序功能
四、实验的思考
实验中任务3中编写的程序无法做到实时监控按键的信息,这需要学习了中断技术后才能做成功。
实验5.汇编语言程序设计
姓名孙叶城学号2011011700实验班号33机器号35
一.实验目的
1.掌握编写和调试汇编语言程序的方法;
2.掌握模块化汇编语言程序设计方法
3.了解简单电路的控制方法
二.实验任务
1.简单电子表的设计用8个发光二极管以秒为单位显示时间值,按下面步骤完成一个简单电子表的设计:
1)硬件连线:
用跳线将L6~L1分别与P2.5~P2.0连接,L6~L1用于显示秒值;用双口长线将L7与P5.0连接,L8与P5.1连接,L8~L7用于显示分钟值;蜂鸣器的控制端Buzz与P4.1连接;
2)编写延时子程,延时时间长度约1秒。
可参考附录A例程test_asm.s43中的delay子程,将其中的#10改为#4;#4000h改为#0FFFFh,执行该delay子程的时间约为1秒。
(执行延时子程的时间可以通过设置1个I/O引脚(如P2.0)输出0,delay延时,再输出1,delay延时,如此循环可在该引脚输出一个方波,用示波器测量该方波周T,可以粗略得到延时子程的执行时间Tdelay=T/2。
)
3)编写完整程序:
计数秒值,用8个发光二极管以二进制将时间显示出来,如图5-1,其中高两位显示分钟值(L8、L7),低6位显示秒值(L6~L1),每60秒,分钟值加1,如图5-1,黑色表示亮,则显示的时间表示表示3分27秒。
每计数到4分钟时,控制蜂鸣器发出一报警声,然后又从0开始重新计数。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
BIC.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2SEL
BIS.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2OUT
BIS.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2DIR
BIC.b#BIT0+BIT1,&P5SEL
BIS.b#BIT0+BIT1,&P5OUT
BIS.b#BIT0+BIT1,&P5DIR
BIC.b#BIT1,&P4SEL
BIS.b#BIT1,&P4OUT
BIS.b#BIT1,&P4DIR
start:
MOV#0,R4
MOV#3,R5
next:
MOV#0,R6
MOV#60,R7
then:
INVR6
MOV.bR6,&P2OUT
INVR6
CALL#delay
INCR6
DECR7
JNZthen
INCR4
BIC.bR4,&P5OUT
DECR5
JNZnext
BIC.b#BIT1,P4OUT
CALL#delay
BIS.b#BIT1,P4OUT
BIS.b#BIT0+BIT1,&P5OUT
JMPstart
delay:
MOV#4,R8
wait1:
MOV#0FFFFh,R9
wait2:
DECR9
JNZwait2
DECR8
JNZwait1
RET
END
2.数码管的显示控制
请根据上面的工作原理描述,编程实现对数码管的控制:
编程控制数码管顺序显示0~9和A、b、C、d、E、F,已知它们对应的数码管显示码分别为3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h、7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGDATA16_C
LEDtab:
DB3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
BIC.b#BIT1+BIT2+BIT3+BIT4,&P6SEL
BIS.b#BIT1,&P6OUT
BIS.b#BIT1+BIT2+BIT3+BIT4,&P6DIR
start:
MOV#10h,R4
MOV#0,R5
next:
MOV#8,R6
MOV.bLEDtab(R5),R7
CALL#then
INCR5
DECR4
JNZnext
JMPstart
then:
RLC.bR7
JCww1
BIC.b#BIT4,&P6OUT
JMPww2
ww1:
BIS.b#BIT4,&P6OUT
ww2:
BIC.b#BIT2,&P6OUT
BIS.b#BIT2,&P6OUT
BIC.b#BIT2,&P6OUT
DECR6
JNZthen
BIC.b#BIT3,&P6OUT
BIS.b#BIT3,P6OUT
BIC.b#BIT3,&P6OUT
CALL#delay
RET
delay:
MOV#4,R8
wait1:
MOV#0FFFFh,R9
wait2:
DECR9
JNZwait2
DECR8
JNZwait1
RET
END
思考:
如果数码管电路的控制端DS、SHCP、STCP、#MR分别与单片机的P4.3~P4.0相连,如何修改程序?
请用长导线在实验板上完成。
把P6XXX换成P4XXX。
实验板上用跳线把对应的相连接。
三、已完成的选做任务
1.(选做)增加按键控制功能:
当按下KEY2键时清零;按下KEY3键时开始(或称继续)计时;按下KEY4键时暂停计时。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
BIC.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2SEL
BIS.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2OUT
BIS.b#BIT0+BIT1+BIT2+BIT3+BIT4+BIT5,&P2DIR
BIC.b#BIT0+BIT1,&P5SEL
BIS.b#BIT0+BIT1,&P5OUT
BIS.b#BIT0+BIT1,&P5DIR
BIC.b#BIT0,&P4SEL
BIS.b#BIT0,&P4OUT
BIS.b#BIT0,&P4DIR
BIC.b#BIT1+BIT2+BIT3,&P3SEL
BIC.b#BIT1+BIT2+BIT3,&P3DIR
MOV.b#0FFh,R9
start:
MOV#0,R4
MOV#4,R5
next:
MOV#0,R6
MOV#60,R7
test1:
BIT.b#BIT1,&P1IN
JZww1
BIT.b#BIT2,&P1IN
JZww2
BIT.b#BIT3,&P1IN
JZww3
BIT#0FBh,R9
JNZtest1
JMPtest2
ww1:
CMP.b#0FFh,R9
JCtest1
MOV.b#BIT1,R9
JMPtest2
ww2:
MOV.b#BIT2,R9
JMPtest2
ww3:
MOV.b#BIT3,R9
test2:
BIT#0FDh,R9
JZzero2
BIT#0FBh,R9
JZzero1
BIT#0FBh,R9
JMPtest1
zero1:
TST.bR6
JNZthen
zero2:
MOV#0,R4
MOV#4,R5
MOV#0,R6
MOV#60,R7
BIS.b#BIT0+BIT1,&P5OUT
then:
INVR6
MOV.bR6,&P2OUT
INVR6
INCR6
CALL#delay
BIT#0FDh,R9
JZss
JMPtest1
DECR7
JNZthen
INCR4
BIC.bR4,&P5OUT
DECR5
JNZnext
BIC.b#BIT1,P4OUT
JMPstart
delay:
MOV#4,R8
wait1:
MOV#0FFFFh,R10
wait2:
DECR10
JNZwait2
DECR8
JNZwait1
RET
ss:
MOV.b#BIT2,R9
JMPtest1
END
思考:
如果硬件连线是将发光二极管LED8~LED1分别与P2.7~P2.0连接,按键Key4~Key2分别与P1.4~P1.2连接,蜂鸣器BUZZ与P6.5连接的话,实验板上连线,如何编程实现任务1?
把程序中的P5XXX换成P2XXX。
源程序中Key4~Key2对应P1.3~P1.1,只需相应的修改一下即可。
同理,把P4XXX换成P6XXX。
2.(选做)编程当分别按下KEY8~KEY1键时,在数码管上分别显示8~1,比如按下键KEY8,数码管上显示“8”;按下键KEY2,数码管上显示“2”等。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGDATA16_C
LEDtab:
DB06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
BIC.b#BIT1+BIT2+BIT3+BIT4,&P6SEL
BIS.b#BIT1,&P6OUT
BIS.b#BIT1+BIT2+BIT3+BIT4,&P6DIR
MOV.b#0,&P1SEL
MOV.b#0,&P1DIR
start:
MOV#0,R5
MOV#8,R6
MOV#8,R9
test1:
MOV.b&P1IN,R7
test2:
RRA.bR7
JNCnext
INCR5
DECR6
JNZtest2
BIT#8,R5
JNZtest1
next:
MOV.bLEDtab(R5),R8
CALL#then
JMPstart
then:
RLC.bR8
JCww1
BIC.b#BIT4,&P6OUT
JMPww2
ww1:
BIS.b#BIT4,&P6OUT
ww2:
BIC.b#BIT2,&P6OUT
BIS.b#BIT2,&P6OUT
BIC.b#BIT2,&P6OUT
DECR9
JNZthen
BIC.b#BIT3,&P6OUT
BIS.b#BIT3,P6OUT
BIC.b#BIT3,&P6OUT
RET
END
3.(选做,可在simulator下完成)带初始化变量的实现(数据传送程序)
问题的提出:
初始化的变量和未初始化变量的不同在于,在执行程序前,初始化的变量中有设置好的初值,而未初始化的变量没有设置好的初值。
由于MCU内部没有操作系统,上电复位后即开始执行用户程序,存放在RAM区中的变量的值都是随机的,不能保存如何完成带初始值的变量设置呢?
编程实现:
在汇编语言程序中设置一个带初始化的字符串,字符串的初始值为“HelloMSP430”。
程序清单如下:
#include"msp430.h"
NAMEmain
PUBLICmain
ORG0FFFEh
DC16init
RSEGDATA16_C
string:
DB"HELLOMSP430"
RSEGDATA16_I
buffer:
DS12
RSEGCSTACK
RSEGCODE
init:
MOV#SFE(CSTACK),SP
main:
NOP
MOV.W#WDTPW+WDTHOLD,&WDTCTL
MOV#0Bh,R4
MOV#0,R5
start:
MOV.bstring(R5),buffer(R5)
INCR5
DECR4
JNZstart
JMP$
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件 基础 实验 报告 汇编语言 程序结构 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)