四川大学网络教育学院
实践课程报告
实践课程 计算机综合实践报告
校外学习中心
专业 电气工程及其自动化
层 次 专升本
年 级 2010年春
学生名字
学号
2012年5月31号
实验一DEBUG 调试工具熟悉、使用
一、 实验科目:熟悉、使用DEBUG 调试工具
二、 实验日期:2011年4月22日
三、 实验目的
1、
2、 了解并逐步熟习汇编语言的编辑方式及特点 复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等
3、
4、
5、 掌握汇编语言的编辑、汇编及连接过程 了解并逐步掌握运用DEBUG 进行调试汇编语言程序 借助DEBUG 调试工具来发现汇编语言程序的错误所在并加以改正
四、 实验内容
1、 进入DEBUG
方法1:在Windows 开始菜单中单机运行命令,直接在运行对话框中输入“DEBUG ”
方法2:在运行对话框中输出“CMD ”启动DOS 命令窗口后输入“DEBUG ”
方法3:在程序、附件、命令提示符,启动DOS 命令窗口后输入“DEBUG ”
2、 DEBUG 命令格式
DEBUG 的每个命令都是一个字母后跟一个或多个参数,下面对DEBUG 命令作几点说明:
(1) 字母部分大小写
(2) 只使用16进制数,且不能带后缀H
(3) 以空格或逗号作为命令各项之间的分隔符。分隔符只在
两个数值之间是必须的
(4) 可以用Ctrl-C 或Ctrl-Break 终止命令执行
(5) 若输入的命令有语法错误,则提示“Error ”,并用“∧”
指出错误位置
3、 常用的Debug 功能
用Debug 的R 命令查看、改变CPU 寄存器的内容;
用Debug 的D 命令查看内存中的内容
用Debug 的E 命令改写内存中的内容
用Debug 的U 命令将内存中的机器指令翻译成汇编指令
用Debug 的T 命令执行一条机器指令
用Debug 的A 命令以汇编指令的格式在内存中写一条机器指令
4、 用Debug 的R 命令查看、改变CPU 寄存器的内容
R 命令用来显示和修改寄存器的值,包括以下两种格式。
(1) R
显示所有寄存器和8个标志位的值,并反汇编CS :IP
所指的指令
(2) R (寄存器名)
显示指定寄存器的值,并等待用户键入新的值,按回车
键结束R 命令
5、 用Debug 的D 命令查看内存中的内容
D命令可以查看内存中的内容,D 命令的格式较多,只介绍本次实验中用到的格式,8086/8088CPU能够访问1M 内容,D 命令可以显示0000:0000H-FFFF :FFFFH 中的任何一个单元的内存 如果想知道内存100000H 处的内容,可以用“d 段地址:偏移地址”的格式来查看,如输入-d1000:0
使用d1000:9查看1000:9处的内容
使用d1000:0 9查看1000:0—1000:9的内容
一进入Debug ,可直接使用D 命令直接查看,将列出Debug 预设的地址处的内容
6、 用Debug 的E 命令改写内存中的内容
使用“e 起始地址数据数据数据„„”的格式来进行
如讲内存1000:0-1000:9单元中的内容分别改写为0、1、2、3、4、5、6、7、8、9
-e1000:0 0123456789
也可采用提问方式一个一个修改内存中的内容,如输出e1000:0按Enter 健结束操作
输入字符串的格式:如-e1000:101‘a ’2”C++”3”IBM ”将输入1a2c++3IBM到相应单元
向内容中写入机器码, 如b80100(代表mov ax 0001),·b90200 (代表mov cx 002),01c8(代表 add ax cx),那么输入-e1000:0 b8 01 00 b9 02 00 01 c8就将该程序输入内容1000:0处,然后使用u
命令-u 1000:0可以将内存单元中的内容翻译成汇编指令。如果要执行该程序,首先用r 命令,单击执行程序。执行T 命令时,CPU 执行CS :IP 执行的指令并将IP 加1
7、 用Debug 的A 命令以汇编指令的形式在内存中写了机指令示例:用A 命令,输入下列程序并运行
–a 1000:0
mov ax, 1
movbx, 2
mov cx, 3
add ax, bx
add ax, cx
add ax, ax
直接按Enter 健结果输入。用r 命令将cs 修改成1000,ip 修改成0,再执行t 命令,单步执行程序。执行T 命令时,CPU 执行CS :IP 执行的指令并将IP 加1.
实验二设计汇编语言程序
一、 实验目的:设计汇编语言程序
二、 实验日期:2012年5月31日
三、 实验目的
字符串统计程序设计
双字乘法程序设计
四、 实验内容
1、 字符串统计
在数据段总建立一个缓冲区BUFFER ,变量VER ,编程使得
程序具有如下功能:从键盘输入一个子字符串存入VER ,从键盘输入包含一个或几个字符串的字符串存入BUFFER 。统计BUFFER 中的字符串含有多少各子字符串以及每个子字符串的位置
2、 双字乘法程序
设计一个程序实现32位带符号双精度数乘法运算。由于只有8位和16位的乘法指令。因此32位乘法运算是不能直
接用指令实现的。但可以用16位乘法指令,通过4次相乘然后把部分积相加。对于带符号数,可以先根据绝对值求
得积。然后判断积的符号,若积为负数,应将其用补码表
示
五、 程序设计
1、 字符串统计程序设计
#include
Using namespace std
int main
char a; int b=0,c=0,f=0
cout
a=cin.get()
while(a!=′/n′)
if(a128)
b++
else if (a>=′a ′&&aA&&a
c++
else if(a==′′)
d++
else if(a>=′0′&&a
e++
else if++
a=cin.get()
cout
cout
Cout
Return 0
分别统计出英文字母,空格,数字和其他字符的个数
2、 双字乘法程序设计
Data segment
Xdw 1,2;被乘数
Ydw 3,4;乘数
Zdw 4 dup (?);积
Data ends
Code segment
Assume ds;data,cs:code
Start:
Movax,data
Movds,ax
Mul y
Movz,ax
Mov z+2,dx
Mov ax,x+2
Mul y
Mov z+4,ax
Mov z+6,dx
Movax,x
Mov y+2
Add z+4,ax
Add z+6,ax
Mov ax,x+2
Mul y+2
Adc z+10,dx
Adc z+12,0
Mov ax,4c00h
Int 21h
Code ends
End start
实验三 8253定时器、计算器接口与数字电子琴
一、实验科目:8253定时器、计算器接口与数字电子琴
二、实验日期:2012年5月31日
三、实验目的:
改变定时器2的计数值来改变声音频率,通过编程来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。
四、实验内容
设计程序让微机演奏一段简单乐曲
利用DOS 的键盘管理功能,将微机变为一个具有简单功能的电子琴
六、 程序设计
硬件设计
利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的通断。
8255的A 口设计为输出,8255的A 口的低两位用来控制扬声器驱动,当输出端口的PAO 位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8253所发出的音频信号能到达驱动器或被阻断。这样通过控制PAO 的变化,可使扬声器接通和断开,就能发出不同的音长。8255的PA1位为“1”时,控制8253定时器产生驱动扬声器发出的音频信号,该位为“0”则不发信号,8253有三飞定时器,分别为0号、1号和2号定时器,驱动扬声器的是0号定时器,该定
时器工作方式3,是一个频率发送器,它负责向扬声器发送指定频率的脉冲信号。当8255的PA0和PA1都为1时,8253发出的频率的声音信号前提下,声音信号通过与门到达驱动器驱动扬声器发声。
软件设计
系统要求实现2个功能,电子琴和音乐的功能。两者发声的方法一样,只是一个数据从键盘读取,另一个是已经保存好的数据。首先我们可以用一个程序实现单各音调的产生,对8253输入不同的计数初值生成不同频率的波形,然后延时一段实践。电子琴程序主要是读取键盘按键,根据键值产生不同的音调即可。而乐曲的播放先将乐曲的音符编码表和节拍编码表建立好,然后在播放时读取数据。
1、 单音调子程序SOUND
单音调子程序的调用前需要进行以下几个方面工作:
(1) 确定相应的音调所对应的频率,查表可以得到,再由频率得
到对应的8253计数初值
(2) 确定音长,即一个音符所持续的时间。
在单音调子程序中实现发出一个音符的声音,持续所需的时间,流程如下:
→读取8253计数初值和音长→8253置初值→开启与门和8253GATE →延时→关闭与门和8253GATE →返回
2、 音乐盒程序
音乐盒的乐曲播放程序中需要有两组数据支持:一组是频率
数据,一组是节拍时间数据。音符的频率可以用过简谱从频率表中查得、节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。
有了音调与频率和实践的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和节拍值,调用单音调子程序就可依次产生各个音调,播放出乐曲。
在程序中储存几个乐曲数据,根据音乐盒子菜单选择相应的乐曲演奏,读取对应的数据输出。
四川大学网络教育学院
实践课程报告
实践课程 计算机综合实践报告
校外学习中心
专业 电气工程及其自动化
层 次 专升本
年 级 2010年春
学生名字
学号
2012年5月31号
实验一DEBUG 调试工具熟悉、使用
一、 实验科目:熟悉、使用DEBUG 调试工具
二、 实验日期:2011年4月22日
三、 实验目的
1、
2、 了解并逐步熟习汇编语言的编辑方式及特点 复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等
3、
4、
5、 掌握汇编语言的编辑、汇编及连接过程 了解并逐步掌握运用DEBUG 进行调试汇编语言程序 借助DEBUG 调试工具来发现汇编语言程序的错误所在并加以改正
四、 实验内容
1、 进入DEBUG
方法1:在Windows 开始菜单中单机运行命令,直接在运行对话框中输入“DEBUG ”
方法2:在运行对话框中输出“CMD ”启动DOS 命令窗口后输入“DEBUG ”
方法3:在程序、附件、命令提示符,启动DOS 命令窗口后输入“DEBUG ”
2、 DEBUG 命令格式
DEBUG 的每个命令都是一个字母后跟一个或多个参数,下面对DEBUG 命令作几点说明:
(1) 字母部分大小写
(2) 只使用16进制数,且不能带后缀H
(3) 以空格或逗号作为命令各项之间的分隔符。分隔符只在
两个数值之间是必须的
(4) 可以用Ctrl-C 或Ctrl-Break 终止命令执行
(5) 若输入的命令有语法错误,则提示“Error ”,并用“∧”
指出错误位置
3、 常用的Debug 功能
用Debug 的R 命令查看、改变CPU 寄存器的内容;
用Debug 的D 命令查看内存中的内容
用Debug 的E 命令改写内存中的内容
用Debug 的U 命令将内存中的机器指令翻译成汇编指令
用Debug 的T 命令执行一条机器指令
用Debug 的A 命令以汇编指令的格式在内存中写一条机器指令
4、 用Debug 的R 命令查看、改变CPU 寄存器的内容
R 命令用来显示和修改寄存器的值,包括以下两种格式。
(1) R
显示所有寄存器和8个标志位的值,并反汇编CS :IP
所指的指令
(2) R (寄存器名)
显示指定寄存器的值,并等待用户键入新的值,按回车
键结束R 命令
5、 用Debug 的D 命令查看内存中的内容
D命令可以查看内存中的内容,D 命令的格式较多,只介绍本次实验中用到的格式,8086/8088CPU能够访问1M 内容,D 命令可以显示0000:0000H-FFFF :FFFFH 中的任何一个单元的内存 如果想知道内存100000H 处的内容,可以用“d 段地址:偏移地址”的格式来查看,如输入-d1000:0
使用d1000:9查看1000:9处的内容
使用d1000:0 9查看1000:0—1000:9的内容
一进入Debug ,可直接使用D 命令直接查看,将列出Debug 预设的地址处的内容
6、 用Debug 的E 命令改写内存中的内容
使用“e 起始地址数据数据数据„„”的格式来进行
如讲内存1000:0-1000:9单元中的内容分别改写为0、1、2、3、4、5、6、7、8、9
-e1000:0 0123456789
也可采用提问方式一个一个修改内存中的内容,如输出e1000:0按Enter 健结束操作
输入字符串的格式:如-e1000:101‘a ’2”C++”3”IBM ”将输入1a2c++3IBM到相应单元
向内容中写入机器码, 如b80100(代表mov ax 0001),·b90200 (代表mov cx 002),01c8(代表 add ax cx),那么输入-e1000:0 b8 01 00 b9 02 00 01 c8就将该程序输入内容1000:0处,然后使用u
命令-u 1000:0可以将内存单元中的内容翻译成汇编指令。如果要执行该程序,首先用r 命令,单击执行程序。执行T 命令时,CPU 执行CS :IP 执行的指令并将IP 加1
7、 用Debug 的A 命令以汇编指令的形式在内存中写了机指令示例:用A 命令,输入下列程序并运行
–a 1000:0
mov ax, 1
movbx, 2
mov cx, 3
add ax, bx
add ax, cx
add ax, ax
直接按Enter 健结果输入。用r 命令将cs 修改成1000,ip 修改成0,再执行t 命令,单步执行程序。执行T 命令时,CPU 执行CS :IP 执行的指令并将IP 加1.
实验二设计汇编语言程序
一、 实验目的:设计汇编语言程序
二、 实验日期:2012年5月31日
三、 实验目的
字符串统计程序设计
双字乘法程序设计
四、 实验内容
1、 字符串统计
在数据段总建立一个缓冲区BUFFER ,变量VER ,编程使得
程序具有如下功能:从键盘输入一个子字符串存入VER ,从键盘输入包含一个或几个字符串的字符串存入BUFFER 。统计BUFFER 中的字符串含有多少各子字符串以及每个子字符串的位置
2、 双字乘法程序
设计一个程序实现32位带符号双精度数乘法运算。由于只有8位和16位的乘法指令。因此32位乘法运算是不能直
接用指令实现的。但可以用16位乘法指令,通过4次相乘然后把部分积相加。对于带符号数,可以先根据绝对值求
得积。然后判断积的符号,若积为负数,应将其用补码表
示
五、 程序设计
1、 字符串统计程序设计
#include
Using namespace std
int main
char a; int b=0,c=0,f=0
cout
a=cin.get()
while(a!=′/n′)
if(a128)
b++
else if (a>=′a ′&&aA&&a
c++
else if(a==′′)
d++
else if(a>=′0′&&a
e++
else if++
a=cin.get()
cout
cout
Cout
Return 0
分别统计出英文字母,空格,数字和其他字符的个数
2、 双字乘法程序设计
Data segment
Xdw 1,2;被乘数
Ydw 3,4;乘数
Zdw 4 dup (?);积
Data ends
Code segment
Assume ds;data,cs:code
Start:
Movax,data
Movds,ax
Mul y
Movz,ax
Mov z+2,dx
Mov ax,x+2
Mul y
Mov z+4,ax
Mov z+6,dx
Movax,x
Mov y+2
Add z+4,ax
Add z+6,ax
Mov ax,x+2
Mul y+2
Adc z+10,dx
Adc z+12,0
Mov ax,4c00h
Int 21h
Code ends
End start
实验三 8253定时器、计算器接口与数字电子琴
一、实验科目:8253定时器、计算器接口与数字电子琴
二、实验日期:2012年5月31日
三、实验目的:
改变定时器2的计数值来改变声音频率,通过编程来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。
四、实验内容
设计程序让微机演奏一段简单乐曲
利用DOS 的键盘管理功能,将微机变为一个具有简单功能的电子琴
六、 程序设计
硬件设计
利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的通断。
8255的A 口设计为输出,8255的A 口的低两位用来控制扬声器驱动,当输出端口的PAO 位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8253所发出的音频信号能到达驱动器或被阻断。这样通过控制PAO 的变化,可使扬声器接通和断开,就能发出不同的音长。8255的PA1位为“1”时,控制8253定时器产生驱动扬声器发出的音频信号,该位为“0”则不发信号,8253有三飞定时器,分别为0号、1号和2号定时器,驱动扬声器的是0号定时器,该定
时器工作方式3,是一个频率发送器,它负责向扬声器发送指定频率的脉冲信号。当8255的PA0和PA1都为1时,8253发出的频率的声音信号前提下,声音信号通过与门到达驱动器驱动扬声器发声。
软件设计
系统要求实现2个功能,电子琴和音乐的功能。两者发声的方法一样,只是一个数据从键盘读取,另一个是已经保存好的数据。首先我们可以用一个程序实现单各音调的产生,对8253输入不同的计数初值生成不同频率的波形,然后延时一段实践。电子琴程序主要是读取键盘按键,根据键值产生不同的音调即可。而乐曲的播放先将乐曲的音符编码表和节拍编码表建立好,然后在播放时读取数据。
1、 单音调子程序SOUND
单音调子程序的调用前需要进行以下几个方面工作:
(1) 确定相应的音调所对应的频率,查表可以得到,再由频率得
到对应的8253计数初值
(2) 确定音长,即一个音符所持续的时间。
在单音调子程序中实现发出一个音符的声音,持续所需的时间,流程如下:
→读取8253计数初值和音长→8253置初值→开启与门和8253GATE →延时→关闭与门和8253GATE →返回
2、 音乐盒程序
音乐盒的乐曲播放程序中需要有两组数据支持:一组是频率
数据,一组是节拍时间数据。音符的频率可以用过简谱从频率表中查得、节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。
有了音调与频率和实践的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和节拍值,调用单音调子程序就可依次产生各个音调,播放出乐曲。
在程序中储存几个乐曲数据,根据音乐盒子菜单选择相应的乐曲演奏,读取对应的数据输出。