当前位置:文档之家› 【实验】汇编实验报告

【实验】汇编实验报告

【关键字】实验实验一汇编程序的汇编及运行1.实验目的和要求(1)熟悉汇编程序的汇编、连接、执行过程(2)生成LST文件,查看LST文件(3)生成OBJ文件,修改语法错误(4)生成EXE文件(5)执行2.实验环境IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录(1)将数据段输入,取名1.txt,保存在MASM文件夹下。

生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。

试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?DA TA SEGMENTORG 20HNUM1=8NUM2=NUM1+10HDA1 DB ‘IBM PC’DA2 DB 0AH, 0DHCOUNT EQU $-DA1DATA ENDSEND(2)输入有错误的文件,修改错误语句。

(MASM没有出现错误即可。

不必连接、运行。

)DA TA SEGMENTV AR1 DB 0, 25, ODH, 300V AR2 DB 12H, A4H, 6BHV AR3 DB ’ABCDEF’V AR4 DW 1234H, 5678HV AR5 DW 10H DUP(?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DE: DA TABEING MOV AX, DA TAMOV DS, AXLEA SI, V AR5MOV BX, OFFSET V AR2MOV [SI], 0ABHMOV AX, V AR1+2MOV [BX], [SI]MOV V AR5+4, V AR4MOV AH, 4CHINT 21HCODE ENDSEND START(3)输入正确的程序,汇编、连接、运行STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDATAS SEGMENTSTRING DB ‘WELCOME!’, 13, 10, ‘$’DATAS ENDSCODES SEGMENTASSUME CS: CODES, DS: DATAS START:MOV AX, DA TASMOV DS, AXLEA DX, STRINGMOV AH, 9INT 21HMOV AH, 4CHINT 21HCODES ENDSEND START 1.算法描述及实验步骤1.(1)生成1.st文件(2)用EDIT查看文件2.修改后正确算法:DATA SEGMENTV AR1 DB 0, 25, 0DH, 30V AR2 DB 12H, 0A4H, 6BHV AR3 DB 'ABCDEF'V AR4 DW 1234H, 5678HV AR5 DW 10H DUP(?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA BEING: MOV AX, DATAMOV DS, AXLEA SI, V AR5MOV BX, OFFSET V AR2MOV byte ptr[SI], 0ABHMOV AL, V AR1+2MOV AX, [SI]MOV [BX], AXMOV AX, V AR4MOV V AR5+4, AXMOV AH, 4CHINT 21HCODE ENDSEND BEING5.调试过程1.程序没有错误,结果:2.程序运行出现错误:问题及改正:(1). 2.asm(2): error A2009: Symbol not defined: ODH 表示没有定义ODH;出错语句VAR1 DB 0, 25, ODH, 300,这里的 ODH应该为 16进制数的0DH。

修改后仍提示错误,因为300越界,可改为30 。

(2). 2.asm(3): error A2009: Symbol not defined: A4H 没有定义A4H这个变量出错语句“VAR2 DB 12H, A4H, 6BH”16进制中字母开头的16进制数开头必须加上“0”,所以必须在A4H之前加0.,将其改为0A4H。

(3).2.asm(9): error A2009: Symbol not defined:DS是存储代码段的,所以将DE改为DS。

(4). 2.ASM(10): error A2105: Expected: instruction or directive ;问题:这是符号的漏写了,语句“BEING MOV AX, DAT”中BEING后面漏了“:”,所以应加上“:”。

(5). 2.asm(14): error A2035: Operand must have size 没有指明大小出错语句“MOV [SI], 0ABH”立即数存入内存中,必须指明大小;所以必须在[SI]前加入 byte ptr 改为“MOV byte ptr[SI], 0ABH”(6). 2.asm(15): error A2068: Cannot address with segment register出错语句“MOV AX, VAR1+2” VAR1的地址+2后只占8位空间,而AX寄存器为16位,所以位数不匹配,应该把AX改为AL或者AH这些8位的寄存器。

(7).2.asm(16): error A2052: Improper operand type出错语句“MOV [BX], [SI] ”MOV指令不允许两个内存单元之间的直接操作,需要引入一个通用寄存器AX 作为中介,修改后“MOV AX, [SI]MOV [BX], AX”(8).2.asm(17): error A2052: Improper operand type 这个问题与上面那个相同,修改方式也同上。

修改为:“MOV AX, VAR4MOV VAR5+4, AX”(9). asm(21): error A2009: Symbol not defined: START 没有定义START END START 这里的END应该跟上面的BEING:对应,所以可以把“END START”改为“END BEING”;或者将上面的“BEING”改为“START”6. 实验结果1.程序正常运行,用EDIT查看1.lst文件得到题目要求数据:2.修改后无错误,达到题目要求:3.对文件进行汇编,连接产生3.exe文件在DOS下运行,结果如下7. 总结通过这次的实验让我初步的熟悉汇编程序的汇编、连接、执行等过程,对于汇编指令了解了不少。

在这次实验最主要是学会了如何找错,修改,查看结果等。

在改错过程中,基础知识是必不可少的,没有认真注意一些指令的常规用法、数据的转移等就会出现错误。

我们在书写程序指令的时候就要牢记指令的用法,不能每次都依靠电脑提示去找错,增加工作量。

实验二顺序程序设计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, 4E20ADD AX, 1416MOV BX, 2000ADD AX, BXMOV BX, AXADD AX, BXMOV AX, 001AMOV BX, 0026ADD AL, BLADD AH, BLADD BH, ALMOV AH, 0ADD AL, BLADD AL, 9C2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。

DSEG SEGMENTMSG1 DB ‘abc’DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXLEA BX, MSG1MOV CX, 3S: MOV AL, [BX]AND AL, B ;将AL中的ASCII码的第5位置0,;变成大写字母。

MOV [BX], ALINC BXLOOP SMOV AL, 0MOV AH, 4CHINT 21H CSEGENDSEND 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)编写调试下面的程序,用DEBUG 查看数据段中的结果(1))/()510*)((Y X X W Z ++-=,X ,Y ,W 为字节类型变量,结果存于Z 单元,写出数据段和代码段。

(2)X ,Y 为字节类型数,求16/)2*)(8*)((Y X Y X Z --+=,写出完整的数据段和代码段,不用乘除指令。

4.算法描述及实验步骤题目2大写变小写算法:DSEG SEGMENTMSG1 DB ‘ABC ’DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXLEA BX, MSG1MOV CX, 3S: MOV AL, [BX]OR AL, 00100000B (或者用add的指令加上00100000即加上32) MOV [BX], ALINC BXLOOP SMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START题目 3:步骤:(1)在DOS下输入:DEBUG 4.EXE(2)在DEBUG提示符下输入U命令(3)输入:G=0000(4)用D 1406:0命令查看程序执行后数据段的变化算法:DSEG SEGMENTMSG1 DW 7856H,2038HMSG2 DW ?DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV AX,MSG1AND AX,MSG1+2MOV MSG2,AXMOV AL,0MOV AH,4CHINT 21HCSEG ENDSEND START题目4(1)算法:DSEG SEGMENTX DB 2hY DB 2hW DB 3hZ DW ?TEN DB 10DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEGMOV DS,AXMOV BL,XADD BL,YMOV AL,WSUB AL,XIMUL TENADD AX,5IDIV BLMOV Z,AXMOV Z+1,AXMOV AH,4CHINT 21HCSEG ENDSEND START4.2算法:因为不能用乘除指令,所以改用移位指令来代替DSEG SEGMENTX DB 5HY DB 4HZ DB ?DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV AL,XADD AL,YMOV CL,3SAL AL,CLMOV BL,XSUB BL,YSAL BL,1SUB AL,BLMOV AH,ALAND AH,00001111BMOV CL,4SAR AL,CLMOV Z,ALMOV Z+1,AHMOV AH,4CHINT 21HCSEG ENDSEND START5.调试过程4.2在移位中,所移位数大于一时必须用CL寄存器,不能直接写为“sal ax 3”改为“MOV CL,3SAL AL,CL”因为不能用乘除指令,不能直接得出余数,要另加语句“MOV AH,ALAND AH,00001111b”6. 实验结果实验一:以下为T命令执行下的一段内容变化:CS为代码段寄存器,不变;IP为指针寄存器;读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。

相关主题