常熟理工学院
计算机科学与工程学院
实验报告
2013-2014 学年 第 2 学期
课程名称 汇编语言与微机原理
专 业 计算机科学与技术
班 级 计科121
学 号 *********
姓 名 王海波
实验地点 N6-106
指导老师 张 雪 伍
实验报告要求
1.在实验课前要认真预习实验内容,熟习实验的原理、方法及算法等。
2.根据实验指导书要求,认真完成实验内容;实验结束后,按照实验报告的要求认真填写相关内容。
3.实验时要带好实验指导书、实验报告本。
4.实验时要严肃认真,不得互相抄袭。
5.实验课的成绩由实验预习、实验过程、实验结果和实验报告四部分构成。
实验名称 | 实验一 查看CPU和内存,用机器指令和汇编指令编程 | |||||
实验目的 | 掌握DEBUG 的基本命令及其功能 | |||||
实验设备 | PC机器一台 | |||||
实验日期 | ||||||
一、实验预习训练 1. 预备知识:Debug的使用 (1) 什么是Debug? Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。 (2) 我们用到的Debug功能 用Debug的R命令查看、改变CPU寄存器的内容; 用Debug的D命令查看内存中的内容; 用Debug的E命令改写内存中的内容; 用Debug的U命令将内存中的机器指令翻译成汇编指令; 用Debug的T命令执行一条机器指令; 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。 (3) 进入Debug Debug是在DOS方式下使用的程序。我们在进入Debug前,应先进入到DOS方式。用以下方式可以进入DOS: ① 重新启动计算机,进入DOS方式,此时进入的是实模式的DOS。 ② 在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。 (4) 用R命令查看、改变CPU寄存器的内容 1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R 2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名 若要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后按Enter键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter键,即完成了对AX中内容的修改。若想看一下修改的结果,可再用R命令查看。 (5) 用Debug的D命令查看内存中的内容 1)格式:-d 段地址:偏移地址,Debug将列出从指定内存单元开始的128个内存单元的内容。 使用D命令,Debug将输出3部分内容,如图2.34所示。 中间是部分从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。 左边是每行的起始地址。 右边是每个内存单元中的数据对应的可显示的ASCII码字符。 2)格式:-d 段地址:起始偏移地址 结尾偏移地址,Debug将列出指定范围的内存单元的内容。 (6) 用Debug的E命令改写内存中的内容,有两种格式: 1)格式:-e 起始地址 数据 数据 数据……,如要将1000:0开始的10个内存单元修改为0~9,可以用”-e 1000:0 0 1 2 3 4 5 6 7 8 9” | ||||||
2)格式:-e起始地址,逐个单元相继地修改。 如:-e 1000:10 1000:0010 6D.0 61.1 72.2 6B.1c 输入e 1000:10 ,Debug 显示起始地址1000:0010,和1000:0010单元的原始内容:6D,然后光标停在“.”的后面提示输入想要写入数据,输入数据0,然后按空格键,即用输入的数据0改写了当前的内存单元。当前单元处理完成后,Debug将接着显示下一个内存单元的原始内容,并提示读者进行修改,可以用同样的方法处理。改写完毕后,按Enter键,E命令操作结束。 可以用E命令向内存中写入字符,比如:用E命令从内存1000:0开始写入:数值1、字符“a”,数值2,字符“b”,数值3,字符“c”,可以用:“-e 1000:0 1 ‘a’ 2 ‘b’ 3 ‘c’” 修改的结果是,向1000:0、1000:2、1000:4单元中写入数值1、2、3,向1000:1、1000:3、1000: 5单元中写入字符“a”、“b”、“c”的ASCII码值:61H、62H、63H。 也可以用E命令向内存中写入字符串,比如:用E命令从内存1000:0开始写入:数值1、字符串“a+b”、数值2、字符串“c++”、字符3、字符串“IBM”。 可以用:‘-e 1000:0 1 “a+b” 2 “c++” 3 “IBM” ’。 可以用E命令向内存中写入机器码 比如要从内存1000:0单元开始写入这样一段机器码: 机器码 对应的汇编指令 b80100 mov ax,0001 b90200 mov cx,0002 01c8 add ax, cx 可用:”-e 1000:0 b8 01 00 b9 02 00 01 c8” (7) 用U命令查看写入的或内存中原有的机器码所对应的汇编指令 1)-U 段地址:偏移地址 该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。 2)-U地址范围 该命令对指定范围的内存单元进行反汇编 (8)使用T命令,可以执行CS:IP指向的指令,格式:-t,指令执行后,Debug显示输出CPU中寄存器的状态。 (9) 用Debug的A命令以汇编指令的形式在内存中写入机器指令。 格式:-A 段地址:偏移地址 该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。 二、实验内容 (1) 使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。 机器码 汇编指令 b8 20 4e mov ax,4E20H 05 16 14 add ax,1416H bb 00 20 mov bx,2000H 01 d8 add ax,bx 89 c3 mov bx,ax 01 d8 add ax,bx b8 1a 00 mov ax,001AH bb 26 00 mov bx,0026H 00 d8 add al,bl 00 dc add ah,bl 00 c7 add bh,al b4 00 mov ah,0 00 d8 add al,bl 04 9c add al,9CH 提示: 可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。 | ||||||
(2) 将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。 mov ax,1 add ax,ax jmp 2000:0003 (3) 查看内存中的内容 PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请到这个生产日期并试图改变它。 (4) 向内存从B8100H开始的单元中填写数据,如: -e B810:0000 01 01 02 02 03 03 04 04 请读者:先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。 实验报告必须包含内容说明: 写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。 三、实验过程(主要步骤、实现代码) (`) | ||||||
(2) | ||||||
(3) (4) | ||||||
四、实验结果(遇到的问题及解决方法) 第三条的改变日期没搞懂怎么弄,其余都还好。 开始做第一条的时候忘记了分配ip地址导致没做出来。 | ||||||
五、心得体会 (实验收获) 得多看书上的讲解,理解的把题目做出来。 | ||||||
实验预习20% | 实验过程20% | 实验结果30% | 实验报告30% | 成绩 | ||
日期 | ||||||
实验名称 | 实验二 用机器指令和汇编指令编程 | |||||
实验目的 | 掌握DEBUG 的几个补充的命令及其功能。 | |||||
实验设备 | PC机器一台 | |||||
实验日期 | ||||||
一、实验预习训练 1. 预备知识:Debug命令的补充 (1) 在D命令中使用段寄存器 计算机编程语言格式:“d 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。以下是4个例子: ① -r ds :1000 -d ds:0 ;查看从1000:0开始的内存区间中的内容 ② -r ds :1000 -d ds:10 18 ;查看1000:10~1000:18中的内容 ③ -d cs:0 ;查看当前代码段中的指令代码 ④ -d ss:0 ;查看当前栈段中的内容 (2) 在E、A、U命令中使用段寄存器 在E、A、U这些可以带有内存单元地址的命令中,也可以同D命令一样,用段寄存器表示内存单元的段地址。以下是3个例子: ① -r ds :1000 -e ds:0 11 22 33 44 55 66 ;在从1000:0开始的内存区间中写入数据 ② -u cs:0 ;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址 ③ -r ds :1000 -a ds:0 ;以汇编指令的形式,向从1000:0开始的内存单元中写入指令 (3) 下一条指令执行了吗? 在Debug中,用A命令写一段程序: mov ax,2000 mov ss,ax mov sp,10 ;安排2000:0000~2000:000F 为栈空间,初始化栈顶。 mov ax,3123 push ax mov ax,3366 push ax ;在栈中压入两个数据。 在用T命令单步执行mov ax,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:mov ss,ax;在用T命令单步执行mov ss,ax后,下一条指令应该是mov sp,10,却变成了mov ax,3123? 注意,在用T命令单步执行mov ss,ax 前,ax=0000,ss=0b39,sp=ffee,而执行后 ss=2000,sp=0010。ss变为2000是正常的,这正是mov ss,ax的执行结果。而能够将sp设为0010的只有指令mov sp,10,看来,mov sp,10一定是得到了执行。 在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。 整理一下我们分析的结果:在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也 紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU 各个寄存器的状态和下一步要执行的指令,但T命令执行mov ss,ax的时候,没有做到这一点。 不单是mov ss,ax,对于如:mov ss,bx,mov ss,[0],pop ss等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器SS的指令。 | ||||||
结论:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。 二、实验内容 (1) 使用Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax= add ax,[2] ;ax= mov bx,[4] ;bx= add bx,[6] ;bx= push ax ;sp= ;修改的内存单元的地址是 内容为 push bx ;sp= ;修改的内存单元的地址是 内容为 pop ax ;sp= ;ax= pop bx ;sp= ;bx= push [4] ;sp= ;修改的内存单元的地址是 内容为 push [6] ;sp= ;修改的内存单元的地址是 内容为 (2) 仔细观察下图中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变? 用Debug进行实验的示例 实验报告必须包含内容说明: 写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。 三、实验过程(主要步骤、实现代码) | ||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论