汇编实验二--顺序程序设计

  • 格式:doc
  • 大小:346.50 KB
  • 文档页数:22

福建农林大学金山学院实验报告

系: 信息与机电工程 专业: 电子信息技术 年级: 10

姓名: 学号: 1002010 实验课程: 汇编语言

实验室号:____67___ 实验设备号: E 实验时间:

指导教师签字: 成绩:

实验二 顺序程序设计

1.实验目的和要求

1. 学习使用DEBUG的命令;

2. 使用DEBUG命令在数据段中查看程序运行的结果;

3. 利用DEBUG运行简单的程序段。

2.实验环境

实验的硬件环境是:

IBM—PC机及其兼容机

实验的软件环境是:

操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录

1)输入程序观察寄存器变化

使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。注意用T命令执行时,CS: IP寄存器的内容

MOV AX, 4E20

ADD AX, 1416

MOV BX, 2000

ADD AX, BX

MOV BX, AX

ADD AX, BX

MOV AX, 001A

MOV BX, 0026

ADD AL, BL

ADD AH, BL

ADD BH, AL

MOV AH, 0

ADD AL, BL

ADD AL, 9C

2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。

DSEG SEGMENT

MSG1 DB ‘abc’

DSEG ENDS

CSEG SEGMENT

ASSUME CS: CSEG, DS: DSEG

START: MOV AX, DSEG

MOV DS, AX

LEA BX, MSG1

MOV CX, 3

S: MOV AL, [BX]

AND AL, 11011111B ;将AL中的ASCII码的第5位置0,

;变成大写字母。

MOV [BX], AL

INC BX

LOOP S

MOV AL, 0

MOV AH, 4CH

INT 21H

CSEG ENDS

END START

3)程序的跟踪执行操作

在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。那么如何查看程序的运行结果呢?

程序执行过程的跟踪操作步骤如下:

(1)在DOS下输入:DEBUG 文件名.EXE

(2)在DEBUG提示符下输入U命令

(3)可以用T命令单步执行指令,执行到 MOV AH, 4CH时结束,也可以用G命令执行整个程序,输入:G=B地址(如:G=0000)

(4)用D命令查看程序执行后数据段的变化

输入:D K地址:0 (如:D1260:0)

在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。

4)输入下面程序,按实验一和上面步骤运行一遍

DSEG SEGMENT

MSG1 DW 7856H,2038H

MSG2 DW ?

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG

START: MOV AX,DSEG

MOV DS,AX

MOV AX,MSG1

AND AX,MSG1+2

MOV MSG2,AX

MOV AL,0

MOV AH,4CH

INT 21H

CSEG ENDS

END START

5)编写调试下面的程序,用DEBUG查看数据段中的结果

(1))/()510*)((YXXWZ,X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。(无符号数)

(2)X,Y为字节类型数,求16/)2*)(8*)((YXYXZ,写出完整的数据段和代码段,不用乘除指令。(无符号数)

4.算法描述及实验步骤

1)

(1)、dos进入debug环境,输入a进行程序段写入内存操作,如图:

(2)、输入t单步运行跟踪观察到各寄存器的变化如图:

(3)、在执行第一条指令MOV AX, 4E20后寄存器AX内容随即变为4E20,而当执行第二条指令ADD AX, 1416后AX变为了6236,运行随后的指令各寄存器的变化完全吻合程序段所实现的功能,并且不难看到IP由0103不断的增加,而CS保留为13A1不变。

2)

(1)、由文本编辑内容2中的程序段存为II2.txt文件,并masm编译link连接通过,如图:

3)& 4)

(1)、文本编辑内容4中代码段保存为II4.txt,masm编译link连接通过:

(2)、d命令查看MSG2单元中存放的值,如图(执行AND AX,MSG1+2后,未执行MOV MSG2,AX指令):

5)

(5-1)编写程序段如下:

(1)、分析题目可知数据段中有X、Y、W、Z和常数10、5,所以有:

DATA DB 5,10

X DB 2

Y DB 8

Z DW ?

W DB 10

(2)、代码段中先执行(W-X)*10有:

MOV AL,W

SUB AL,X

CBW;之前误解为乘指令操作数需16位故而出现此错误。

MUL DATA+1

之后加5结果除于X+Y有:

ADD AX,DB ;DATA错输入为DB

MOV CL,X

ADD CL,Y

DIV CL

(3)、所以有最初代码如下(错误):

DSEG SEGMENT

DATA DB 5,10

X DB 2

Y DB 8

Z DW ?

W DB 10

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG

START: MOV AX,DSEG

MOV DS,AX

MOV AL,W

SUB AL,X

CBW

MUL DATA+1

ADD AX,DB

MOV CL,X

ADD CL,Y

DIV CL

CSEG ENDS

END START

(5-2)编写程序段如下

(1)、分析题目可知数据段中有X、Y、Z和常数8、2、16,所以有:

DATA DB 8,2,16

X DB 5

Y DB 3

Z DW ?

(2)、代码段先实现(X+X)*8有如下:

MOV AL,X

ADD AL,AL ;实现X+X

MOV CL,3

SHL AL,CL ;逻辑左移3位实现乘8

实现(X-Y)*2有:

MOV BL,X

SUB BL,Y ;实现X-Y

MOV CL,1

SHL BL,CL ;逻辑左移1位实现乘2

实现分子部分(X+X)*8-(X-Y)*2:SUB AL,BL

实现除于16并把结果送Z:

MOV CL,4

SHR AL,CL ;逻辑右移4位实现除于16

MOV Z,AL

(3)、程序段通过编译并并成功链接,如图:

5.调试过程

1)——

2)& 3)

(1)、直接运行II2.exe文件可以看到dos窗口未显示任何信息,于是debug

II2.exe文件跟踪执行,如图:

(2)、t命令单步运行观察到IP在不断得递增指向下一条指令:

(3)、d查看数据段的变化

未执行到循环体内,CX=0003不变:

执行第一和第二次时CX递减,可以看到CX=0002,CX=0001,'a'变为了大写'A,'b'变为了大写'B':

同理之后可以看到CX=0000时执行循环结束完成字符串大小写转换。

5-1)

(1)、编译未能通过如图:

(2)、修改未定义标识符DB为DATA,编译仍然出错:

(3)、操作数位数不一致,分析可知在执行(W-X)*10后结果存放在AX中为能满足除法指令要求被除数为字节时,默认隐含除数为(AX),于是修改代码段如下:

START: MOV AX,DSEG

MOV DS,AX

MOV AL,W

SUB AL,X

MUL DATA+1

MOV BX,AX ;注1

MOV AL,DATA ;注2

CBW ;注3

ADD AX,BX ;实际上注释的指令完全可以用ADD AL,DATA代替,之前是在多此一举,自己在给自己添麻烦。

MOV CL,X