您的当前位置:首页实验1 初级程序的编写与调试实验

实验1 初级程序的编写与调试实验

2024-04-18 来源:乌哈旅游


南昌大学实验报告

学生姓名: 吴文君 学 号: 6100410227 专业班级: 电III106

实验类型:■ 验证 □ 综合 □ 设计 □ 创新 实验日期: 2011-10-2 实验成绩:

实验1 初级程序的编写与调试实验(一)

一.实验目的MOV

1.熟悉DEBUG命令;学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应该试用一下;

2.掌握数据在内存中的存放方式和内存操作数的几种寻址方式,段寄存器和物理地址计算;

3.熟悉数据传送指令、算术运算指令、逻辑指令、循环指令的使用。

4.掌握简单的汇编语言程序编写与调试。

二.实验内容

1. 内存操作数及各种寻址方式使用;

2. 求累加和程序;

3. 多字节加法程序;

4. 数据串搬家程序;

5. 段寄存器概念及字符串传送指令练习。

三.实验要求

1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;

2.阅读数据传送指令、算术运算指令、逻辑指令、循环指令的使用方法

3.用DEBUG的有关命令调试本实验中的求累加和程序、多字节加法程序、程序段

四.实验环境 PC微机;

DOS操作系统或 Windows 操作系统;

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。

五.实验步骤

1.内存操作数及各种寻址方式使用

MOV AX,1234 立即寻址方式

MOV [1000],AX 寄存器寻址方式

MOV BX,1002 立即寻址方式

MOV BYTE PTR[BX],20

MOV DL,39 立即寻址方式

INC BX

MOV [BX],DL 寄存器寻址方式

DEC DL

MOV SI,3

MOV [BX+SI],DL 基址变址寻址方式

MOV [BX+SI+1],DL

MOV WORD PTR[BX+SI+2],2846 相对基址变址寻址方式

步骤:

(1) 用A命令键入上述程序,并用T命令逐条运行。

完成了输入上面的指令;

(2) 每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。

第一条指令执行后:

第一条指令是立即寻址方式

第二条指令执行后:

第三条指令执行后

第四条

第五条

第六条

注意D命令显示结果中右边的ASCII字符及双字节数存放法。

2.求累加和程序: 程序:

MOV BX,1000

MOV CX,10

SUB AX,AX

LOP: ADD AL,[BX]

ADC AH,0

INC BX

J: LOOP LOP

INT 3

步骤:

(1) 用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替;

-a

137C:0100 mov bx,1000

137C:0103 mov cx,10

137C:0106 sub ax,ax

137C:0108 add al,[bx]

137C:010A adc ah,0

137C:010D inc bx

137C:010E loop 0108

137C:0110 int 3

137C:0111

-

(2)用命令N AA 将此程序命名为文件AA(文件名可任取);

-n

-AA

137C:000A

(3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址;

-r bx

BX 0000

:0000

-r cx

CX 0000

:0010

(4)用命令W 100将此程序存到AA命名的磁盘文件中;

-w

Writing 00010 bytes

(5)用命令Q退出DEBUG;

-q

E:\\MASM611\\BIN>

(6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序;

E:\\MASM611\\BIN>debug aa

-u

137C:0100 BB0010 MOV BX,1000

137C:0103 B91000 MOV CX,0010

137C:0106 29C0 SUB AX,AX

137C:0108 0207 ADD AL,[BX]

137C:010A 80D400 ADC AH,00

137C:010D 43 INC BX

137C:010E E2FB LOOP 010B

137C:0110 CC INT 3

137C:0111 0000 ADD [BX+SI],AL

137C:0113 0000 ADD [BX+SI],AL

137C:0115 0000 ADD [BX+SI],AL

137C:0117 0000 ADD [BX+SI],AL

137C:0119 0000 ADD [BX+SI],AL

137C:011B 0034 ADD [SI],DH

137C:011D 006B13 ADD [BP+DI+13],CH

若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入;

(7)用E命令在内存地址1000H处键入16个数字;

-e 1000

137C:1000 00.15 00.56 00.25 00.35 00.15 00.54 00.21 00.54

(8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值;

-g 010e

AX=0015 BX=1001 CX=0010 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010E NV UP EI PL NZ NA PO NC

137C:010E E2FB LOOP 0108

符合预计值

-t

AX=0015 BX=1001 CX=0010 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010E NV UP EI PL NZ NA PO NC

137C:010E E2FB LOOP 0108

(9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错;

AX=0015 BX=1001 CX=000F DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=0108 NV UP EI PL NZ NA PO NC

137C:0108 DS:1001=56

0207 ADD AL,[BX]

-t

AX=006B BX=1001 CX=000F DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010A NV UP EI PL NZ NA PO NC

137C:010A 80D400 ADC AH,00

-t

AX=006B BX=1001 CX=000F DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010D NV UP EI PL ZR NA PE NC

137C:010D 43 INC BX

-t

AX=006B BX=1002 CX=000F DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010E NV UP EI PL NZ NA PO NC

137C:010E E2F8 LOOP 0108

-t

AX=006B BX=1002 CX=000E DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=0108 NV UP EI PL NZ

NA PO NC

137C:0108 DS:1002=25

0207 ADD AL,[BX]

程序没错。执行到loop 语句是跳回到指定的地址

(10)重复G、J与T,再检查AX是否正确;

(11)用G命令使程序运行到结束,检查AX值是否正确。

-g

AX=042F BX=1010 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=0110 NV UP EI PL NZ AC PO NC

137C:0110 CC INT 3

-

3.多字节加法程序 程序:

MOV DI,1000

MOV CX,8

MOV SI,2000

CLC

LOP: MOV AL,[SI]

ADC [DI],AL

INC SI

INC DI

LOOP LOP

INT 20

步骤:

(1) 用命令键入此程序

-a

137C:0100 mov di,1000

137C:0103 mov cx,8

137C:0106 mov si,2000

137C:0109 clc

137C:010A mov al,[si]

137C:010C adc [di],al

137C:010E inc si

137C:010F inc di

137C:0110 loop 010a

137C:0112 int

^ Error

137C:0112 int 20

137C:0114

-

(2) 用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。

-e 1000

137C:1000 00.12 00.23 00.45 00.12

-e 2000

137C:2000 00.23 00.12 00.12 00.12

执行后:

-g 114

Program terminated normally

-d 1000

137C:1000 35 35 57 24 00 00 00 00-00 00 00 00 00 00 00 00

137C:1010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

137C:1070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

4.数据串搬家程序

(1)用A命令键入下列程序:

MOV SI,1000

MOV DI,1500

MOV CX,0FH

LOP:MOV AL,[SI]

MOV [DI],AL

INC SI

INC DI

DEC CX

JNZ LOP

INT 20

(2)用A命令DB伪指令在1000H键入下列字符串:

‘IBM_PC COMPUTER'

137C:1000

-a1000

137C:1000 DB 'IBM_PC COMPUTER'

137C:100F

3.用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致

运行后:

-G 114

Program terminated normally

-D 1500

137C:1500 49 42 4D 5F 50 43 20 43-4F 4D 50 55 54 45 52 00 IBM_PC COMPUTER.

137C:1510 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1520 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1530 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 137C:1570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 是一致的、、、

-

5.自编程序

................

................

................

................

................

................

................

用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同多字节加法程序,调试并做记录。

-a

137C:0100 mov ax,2345

137C:0103 mov cx,1234

137C:0106 mov bx,5678

137C:0109 mov dx,3456

137C:010C sub cx,dx

137C:010E sbb ax,bx

137C:0110

执行后:

AX=2345 BX=5678 CX=1234 DX=3456 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010C NV UP EI PL NZ NA PO NC

137C:010C 29D1 SUB CX,DX

-t

AX=2345 BX=5678 CX=DDDE DX=3456 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=010E NV UP EI NG NZ AC PE CY

137C:010E 19D8 SBB AX,BX

-t

AX=CCCC BX=5678 CX=DDDE DX=3456 SP=FFEE BP=0000 SI=0000 DI=0000

DS=137C ES=137C SS=137C CS=137C IP=0110 NV UP EI NG NZ AC PE CY

137C:0110 75F7 JNZ 0109

注意结果的高位在ax中。低位在cx中。

六.实验报告要求

1.各项实验记录,可以用截图或文字进行说明。

2.要求你修改的程序的清单(修改后)和调试记录,源程序请添加适当的注释。

3.自编程序原稿及调试后修正稿,写出原稿错在那里。

七.简答题

1.MOV BYTE PTR[BX],20

MOV WORD PTR[BX+SI+2],2846

上述指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。

不行

2.用G命令运行多字节加法程序,并用D命令检查其结果(存放在哪里?),是否正确?

对。G命令式将程序执行完,执行后D后面加上你所要差的地址就行了。存放到【1000】中。

3.将多字节加法程序中的INT 20H指令改为INT 3,有何区别?若这条指令不加,行不行?试一试。

行,改为int3后则停留在dos界面,没有区别;若不加指令,可行。

4.数据串搬家程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这一点。

不能,可以将目的地址改为1015h

八、实验总结 熟悉dos的基本操作

发现很多课本上没介绍的操作。还有里面的细节很重要

因篇幅问题不能全部显示,请点此查看更多更全内容