汇编实验报告

福建农林大学计算机与信息学院本科实验报告规范

一、

二、 每个实验项目一份实验报告。 实验报告内容一般包括以下几个内容:

1、 实验项目名称:

2、 实验目的和要求:

3、 实验内容和原理:

4、 实验环境:本次上机实验所使用的软硬件平台。

5、 算法描述及实验步骤:用算法、流程图或者源代码的形式表达算法设计思想与算法实现步骤。

6、 调试过程:详细记录程序在调试过程中出现的问题及解决方法。

7、 实验结果:记录测试数据及程序执行的结果。

8、 总结:对上机实验结果进行分析、上机的心得体会及改进意见。

9、 附录(调试正确的源程序清单)

福建农林大学计算机与信息学院

(程序设计类课程)

实验报告

课程名称: 汇编语言

姓 名:

系: 计算机与信息学院

专 业: 计算机科学与技术

年 级: 12级

学 号:

指导教师:

职 称: 讲师

20xx年 12 月 7 日

实验项目列表

汇编实验报告

福建农林大学计算机与信息学院实验报告

系: 专业: 计算机科学与技术 年级: 2012 姓名: 学号: 实验室号__田513 计算机号

实验时间: 指导教师签字: 张旭玲 成绩: 实验名称:汇编程序的汇编及执行

一、实验目的和要求

(1)熟悉汇编程序的汇编、连接、执行过程;

(2)生成LST文件,查看LST文件;

(3)生成OBJ文件,修改语法错误;

(4)生成EXE文件;

(5)执行程序。

二、实验内容和原理

1)将下面的数据段输入,取名1.ASM,保存在MASM文件夹下。生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?

DATA SEGMENT

ORG 20H

NUM1=8

NUM2=NUM1+10H

DA1 DB ‘IBM PC’

DB 0AH, 0DH

COUNT EQU $-DA1 DATA END ENDS

2)输入下面错误的文件,修改错误语句。(MASM没有出现错误即可。不必连接、运行。)

DATA SEGMENT VAR1 DB 0, 25, ODH, 300 ;ODH改为0DH,300改为30 ;0A4H VAR2 DB 12H, A4H, 6BH

VAR3 DB ’ABCDEF’ VAR4 DW 1234H, 5678H VAR5 DW 10H DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS: CODE, DE: DATA ;de改为ds

;BEING改为START: ;10H去掉H BEING MOV AX, DATA

MOV DS, AX LEA SI, VAR5

MOV BX, OFFSET VAR2 MOV [SI], 0ABH ;byte ptr [si] ;AX改为AL ;内存之间不可赋值,删除 ;内存之间不可赋值,删除 MOV AX, VAR1+2 MOV [BX], [SI] MOV VAR5+4, VAR4 MOV AH, 4CH INT ENDS

END START 21H CODE

3)输入下面程序并运行

STACKS SEGMENT STACK

128 DUP(?)

ENDS

SEGMENT

DB ‘WELCOME!’, 13, 10, ‘$’

ENDS

SEGMENT

ASSUME CS: CODES, DS: DATAS DW STACKS DATAS STRING DATAS CODES

START: MOV

MOV LEA MOV INT AX, DATAS DS, AX DX, STRING AH, 9 21H MOV AH, 4CH

INT ENDS

END 21H CODES START

三、实验环境

PC机,DOS操作系统

四、算法描述及实验步骤

汇编程序从编写到执行的过程

编程→.ASM→编译→.OBJ→连接→.EXE→加载→内存中的程序→执行

1)编写源程序

用EDIT或记事本输入各段,并存储成源程序(保存在MASM目录下),扩展名为ASM。

2)对源程序进行汇编、连接

操作如下:

(1)在DOS状态下,进入MASM目录;

(2)输入命令:MASM 文件名(连同扩展名);

(3)在系统出现的提示中输入:

object filename[.obj]:按回车键。

Source listling[nul.lst]:输入:文件主名,生成lst文件,也可以不生成,直接按回车键。Lst文件用于查看编译为目标文件的过程中产生的中间结果。

Cross-reference [nul.crf]:按回车键。

(4)如果系统没有提示出错,那么编译过程就完成了。如果提示错误则应用edit打开源文件进行修改,然后再重复2和3步骤

(5)输入:link 文件主名(不要输扩展名,也可以输入扩展名.obj)

run file [.exe]:按回车键。

List file [nul.map]:按回车键。

Libraries [.lib]:按回车键。

(6)没有提示错误,汇编过程就结束了,产生了exe可执行文件。如果出现‘no strack segment’的错误警告,不用理会。

3)执行程序(由DOS中的COMMAND命令将文件加载入内存)

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

五、调试过程

六、实验结果

可知,da1,da2的偏移量分别为0020和0026;count 的值为0008.

七、总结

附录:

汇编实验报告

福建农林大学计算机与信息学院实验报告

系: 专业: 计算机科学与技术 年级: 2012级 姓名: 学号: 实验室号__田513 计算机号 (学号)

实验时间: 指导教师签字: 张旭玲 成绩:

实验名称:DEBUG的使用

一、实验目的和要求

(1)学习使用DEBUG的命令;

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

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

二、实验内容和原理

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

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

MOV ADD MOV ADD MOV ADD MOV MOV ADD ADD ADD MOV ADD ADD AX, 4E20 AX, 1416 BX, 2000 AX, BX BX, AX AX, BX AX, 001A BX, 0026 AL, BL AH, BL BH, AL AH, 0 AL, BL AL, 9C

CS为代码段的内容,是固定不变的,IP为下一条命令的起始偏移地址。

2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。如果是将小写字母改成大写字母带注释的语句该如何修改?

DSEG MSG1 DSEG CSEG SEGMENT DB ‘abc’ ENDS SEGMENT

CS: CSEG, DS: DSEG

AX, DSEG

DS, AX

BX, MSG1

CX, 3

AL, [BX]

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

;变成大写字母。 ASSUME START: MOV MOV LEA MOV MOV AND S:

MOV [BX], AL INC LOOP MOV MOV INT ENDS BX S AL, 0 AH, 4CH 21H CSEG

汇编实验报告

汇编实验报告

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

(1)在DOS下输入:DEBUG 文件名.EXE (2)在DEBUG提示符下输入U命令 如果程序中有数据段,可以看到反汇编后第一句可执行语句为: A地址:B地址 MOV AX, K地址 如:1261:0000 MOV AX, 1260 其中:K地址就是数据段的段寄存器内容,A地址为代码段段寄存器地址,B地址为程序第一条指令的偏移地址。

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

(4)用D命令查看程序执行后数据段的变化 输入:D K地址:0 (如:D1260:0) 在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。 4)输入下面的程序,按实验一和上面的步骤运行一遍。这是一个两个数相与的程序。结果存放在MSG2单元中,偏移地址为?值为多少?

DSEG MSG1 MSG2 DSEG CSEG

SEGMENT DW 7856H, 2038H DW ? ENDS SEGMENT ASSUME CS: CSEG, DS: DSEG

START: MOV

AX, DSEG MOV DS, AX MOV AND MOV

汇编实验报告

AX, MSG1 AX, MSG1+2 MSG2, AX

MOV MOV INT AL, 0 AH, 4CH 21H CSEG ENDS

END START

偏移地址为0004,值为1060F000。

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

1)Z?((W?X)*10?5)/(X?Y),X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。

DSeg Segment

x db 38h

y db 20h

w db 30h

z dw ?

ten db 10

DSeg ends

CSeg Segment para public 'CODE'

Assume cs:CSeg,ds:DSeg

Start: mov ax,DSeg

mov ds,ax

mov bl,x

add bl,y ;先求分母,存于BL

mov al,w

sub al,x

imul ten

add ax,5

idiv bl

mov z,ax

mov al,0

mov ah,4ch

int 21h

CSeg ends

end Start

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

dseg segment

x

y

z db 2H db 2H dw ?

ends dseg

cseg segment para public 'code'

assume cs:cseg,ds:dseg

start:mov ax,dseg

mov ds,ax MOV ADD CBW MOV CL,3 AL,X AL,Y SAL AX,CL MOV MOV AL,X BX,AX SUB AL,Y CBW MOV CL,1 SAL AX,CL SUB BX,AX MOV CL,4 SAR BX,CL

mov z,BX mov al,0 mov ah,4ch int 21h

cseg ends

end start

汇编实验报告

三、实验环境

PC机,DOS操作系统

四、算法描述及实验步骤

五、调试过程

六、实验结果

七、总结

附录:(程序)

福建农林大学计算机与信息学院实验报告

系: 专业: 计算机科学与技术 年级: 2012 姓名: 学号: 实验室号__田513 计算机号 (学号) 实验时间: 指导教师签字: 张旭玲 成绩: 实验名称:程序的调试与纠错

一、实验目的和要求

(1)学习调试程序,查找逻辑错误;

(2)学习分支语句的编程和调试;

(3)学习循环语句的编程和调试。

二、实验内容和原理

1)有10个数,统计正数的个数,存放在变量M中中。经过汇编后,形成EXE文件。在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确?(AL寄存器中存放正数的个数)

DSEG MSG M DSEG CSEG

SEGMENT DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6 DB ? ENDS SEGMENT ASSUME CS: CSEG, DS: DSEG

START: MOV

MOV MOV MOV LEA

MOV

CMP

JBE

INC AX, DSEG DS, AX CX, 10 AL, 0 SI, MSG BL, [SI] BL, 0 NEXT AL L1:

NEXT: INC

LOOP MOV MOV MOV INT

ENDS

END SI L1 M, AL AL, 0 AH, 4CH 21H CSEG

START

在这一步骤中可发现,当si=0001时,al=02,出现错误,al应为01.经过检查程序发现为JBE NEXT这条语句错误,这是无符号的比较,应改为JLE NEXT。

2)数据段中是一组无符号数,将最小数存放在M单元中。按上题方法查找一处逻辑错误。

DSEG MSG SEGMENT DB 13, 15, 7, 25, 24 M DB ? DSEG CSEG

ENDS SEGMENT ASSUME CS: CSEG, DS: DSEG

START: MOV

MOV MOV MOV MOV

CMP

JB

MOV AX, DSEG DS, AX CX, 4 AL, MSG SI, OFFSET MSG+1 AL, [SI] NEXT AL, [SI]

si L1: NEXT: inc

LOOP L1

MOV M, AL MOV AL, 0 MOV

汇编实验报告

AH, 4CH

INT CSEG END 21H ENDS START

最后输出结果中发现si=0001,实际为0004。

由以上结果中可看出最后结果为07。

3)编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。

dseg segment

buf db '10da205d0f' result db ?

dseg ends

cseg segment

assume cs:cseg,ds:dseg

start:mov ax,dseg

mov ds,ax mov al,0 lea si,buf mov cl,10

mov bl,byte ptr[si] again:

cmp bl,30h jne next inc al

next:inc si

loop again mov result,al mov al,0 mov ah,4ch int 21h

汇编实验报告

cseg ends

end start

由结果可看出答案为3,正确。

4)编程:Y?

i?1?8?A?B,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开ii始的连续存储单元中,结果存于REST单元中。

DSeg Segment

num1 db 12,34,56,78,65,02,39,8 num2 db 98,65,32,74,78,12,03,56 result dw ?

DSeg ends

CSeg Segment para public 'CODE' Assume cs:CSeg,ds:DSeg

Start: mov ax,DSeg

mov ds,ax mov cx,8

mov bx,0

mov si,offset num1 mov di,offset num2 again: mov al,[si]

mul byte ptr[di]

add bx,ax

inc di

inc si

loop again

mov result,bx

mov al,0 mov ah,4ch int 21h

CSeg ends

end

汇编实验报告

Start

可以看出最后答案为40e1H。

三、实验环境

PC机,DOS操作系统

四、算法描述及实验步骤

五、调试过程

六、实验结果

七、总结

附录:

福建农林大学计算机与信息学院实验报告

系: 专业: 计算机科学与技术 年级: 2012级

姓名: 学号: 1 实验室号__田513 计算机号 21

实验时间: 指导教师签字: 张旭玲 成绩: 实验名称:DOS功能调用

一、实验目的和要求

(1)学习子程序的编写,主子程序的调用;

(2)不同模块间程序的调用和调试。

二、实验内容和原理

1)数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。

DATA MAG DATA CODE SEGMENT DB ‘ABC’ ENDS SEGMENT ASSUME CS: CODE, DS: DATA START: MOV

MOV MOV MOV AX, DATA DS, AX SI, 0 CX, 3

LL:

MOV DL, MAG[SI] CALL MADD INC LOOP MOV INT SI LL AH, 4CH 21H

MADD PROC

MOV AH, 02H INT 21H

RET MADD ENDP CODE ENDS

END START

程序显示结果:

汇编实验报告

D命令查看栈顶内容:

汇编实验报告

2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。

具体步骤如下:

MASM S31.ASM(分别汇编) MASM S32.ASM LINK S31 S32 (将两个文件连接成为一个文件名为S31) S31.EXE (运行)

汇编实验报告

3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)

4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。调用子程序将

BUF1,BUF2,BUF3中的N全部用Y替代。

data segment

buf1 db 'I am a student!','$' len1=$-buf1 buf2 db 'ewfhefnfn','$' len2=$-buf2 buf3 db 'hdinky','$' len3=$-buf3 m db 13,10,'$'

data ends

code segment

assume cs:code,ds:data

start:mov ax,data

cmmp

l1: cmp byte ptr [si],'n' proc lea si,buf2 mov cx,len2 call cmmp lea si,buf3 mov cx,len3 call cmmp mov ah,4ch int 21h mov ds,ax lea si,buf1 mov cx,len1 call cmmp mov dx,si

jnz next mov al,'y' mov [si],al

next:inc si

mov ah,09h int 21h lea dx,m ;回车换行 int 21h ret

endp ;显示字符串 loop l1 cmmp

code ends

end start

程序结果如下:

汇编实验报告

三、实验环境

PC机,DOS操作系统

四、算法描述及实验步骤

五、调试过程

六、实验结果

七、总结

附录:(程序)

NAME S31.ASM

不同模块间的段间调用。从键盘输入2位非压缩BCD数,存入AX寄存器中。为了将其转换为二进制数,编写一个子程序TRAN。显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。输入数据为00时结束。

EXTRN DISP: FAR CODE SEGMENT ASSUME PARA ‘CODE’ CS: CODE START: MOV

INT MOV INT MOV MOV CMP JE CALL CALL JMP AH, 01H 21H BL, AL 21H AH, AL AL, BL AX, 3030H EXIT NEAR PTR TRAN FAR PTR disp START

EXIT: MOV AH, 4CH INT PROC AND 21H NEAR ;将输入的ASCII码转换成2进制数 AX, 0F0FH ;将ASCII码转换成非压缩BCD码, ;高位在AL中 TRAN

MOV MOV MUL ADD RET ENDP ENDS END BL, AH CL, 10D CL AL, BL TRAN CODE START

NAME S32.ASM PUBLIC DISP CODE1 SEGMENT ASSUME PARA ‘CODE’ CS: CODE1 DISP PROC FAR

MOV

MOV

MOV

ROLL: MOV

ROL

MOV

AND

CMP

JBE

ADD

NEXT1: ADD

MOV

INT

DEC

JNZ

RET

DISP ENDP

CODE1 ENDS

END BL, AL BH, 00 CH, 4 CL, 4 BX, CL DL, BL DL, 0FH DL, 9 NEXT1 DL, 07H DL, 30H AH, 02H 21H CH ROLL

福建农林大学计算机与信息学院实验报告

系: 专业: 计算机科学与技术 年级: 2012 姓名: 学号: 实验室号__田513 计算机号 (学号) 实验时间: 指导教师签字: 张旭玲 成绩: 实验名称:子程序

一、实验目的和要求

(1)学会DOS中关于显示功能调用指令的用法;

(2)领会修改显存方法显示字符。

二、实验内容和原理

1)输入一个字符,显示出来。

2)输入一个字符串,显示出来。

3)BUF开始的3个16位二进制数用十六进制数的形式显示出来。

(1)理解程序

(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。

(3)如果要分行显示,程序要如何修改?

MOV MOV MOV

汇编实验报告

SI, 0 BX, BUF[SI] CH, 4 DATA BUF DATA CODE SEGMENT DW 4F59H, 56A8H, 0FF90H ENDS SEGMENT ASSUME CS: CODE, DS: DATA START: MOV MOV AX, DATA DS, AX P:

L: MOV ROL MOV AND CMP JB ADD CL, 4 BX, CL DL, BL DL, 0FH DL, 10 NEXT DL, 7 DL, 30H AH, 2 21H CH L

SI

SI

SI, 4

P

AH, 4CH

21H NEXT: ADD MOV INT DEC JNZ INC INC CMP JNA MOV INT

CODE ENDS END START

4)直接改变显存内容显示。

(1)显存空间分配:

内存地址空间中,B8000H-BFFFFH共32KB的空间,为80×25彩色字符模式显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。

80×25=2000个字符,每个字符在缓冲区中占2个字节,一个字节存放ASCII码,一个字节存放字符属性(字符颜色、字符背景颜色、闪烁、高亮度)

(2)偏移地址计算:

如第2行,第40列:(2-1)×160+40×2 这个偏移地址中存放字符的ASCII码, (2-1)×160+40×2+1这个偏移地址中存放字符的属性。

第M行,第N列的一般计算公式为:

(M-1)×160+N*2 存放ASCII码

(M-1)×160+N*2+1 存放属性

(3)运行下列程序,在屏幕的第1行,会显示一个字符X。根据上面(1)、(2)点理解程序段。

STACK SEGMENT DB 128 DUP (0) STACK ENDS CSEG

SEGMENT ASSUME CS: CSEG, SS: STACK

START: MOV

MOV MOV MOV MOV MOV

MOV

MOV

MOV AX, STACK SS, AX SP, 128 AX, 0B800H ES, AX AH, ‘X’ ES: [160*1+40*2], AH AL, 0 AH, 4CH S:

INT 21H ENDS

END START CSEG

5)编程显示以下图案。

*********

*******

*****

***

*

DSeg Segment

Msg db 0dh,0ah,'$' ;换行 DSeg ends

stack segment stack

dw 100h dup(?)

stack ends

CSeg Segment para public 'CODE' Assume cs:CSeg,ds:DSeg start: mov ax,dseg

mov ds,ax

mov bx,9

lp: mov cx,bx

lop: mov dl,'*' ;显示连续的*号,个数在CX中

mov ah,2

int 21h

loop lop

lea dx,msg ;换行,也可以用程序后面的那段指令来替代 mov ah,09h

int 21h

dec bx ;准备显示下一行,显示的个数加1

dec bx cmp bx,-1

jg lp

mov al,0

mov ah,4ch

int 21h

CSeg ends

end Start

6)编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。

DATA SEGMENT

BUF

汇编实验报告

DW

0,-1,2,4,3,-4,5,6,-7,-6,9,-10,11,14,17,18,-16,-15,8,-13,20,22,-23,0,21

a1 db 0 ;存放正数个数

a2 db 0 ;存放负数个数

a3 db 0 ;0的个数

STR1 DB 'THE NUMBER OF plus IS:','$'

STR2 DB 'THE NUMBER OF minus IS:','$'

STR3 DB 'THE NUMBER OF zero IS:','$'

STR4 DB 0DH,0AH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

LEA SI,BUF

MOV CX,25

LOP: CMP word PTR[SI],0

jge l1 ;>=0转l1

INC a2 ;负数

JMP L3

L1: je l2 ;=0转L2

INC a1 ;正数

JMP L3

L2: INC a3 ;零

L3: ADD SI,2

LOOP LOP

LEA DX,STR1 ;显示正数的字符串

MOV AH,09H

INT 21H

mov bh,0

mov bl,a1

CALL DISP ;通过调用显示子程序显示正数的个数,子程序中的要显示的数字存于bx中

LEA DX,STR4 ;回车换行

MOV AH,09H

INT 21H

LEA DX,STR2

MOV AH,09H

INT 21H

mov bl,a2

CALL DISP

LEA DX,STR4 ;回车换行 MOV AH,09H

INT 21H

LEA DX,STR3

MOV AH,09H

INT 21H

mov bl,a3 CALL DISP

MOV AH,4CH

INT 21H

DISP PROC ;显示BX中的数 mov ch,4 roll: mov cl,4 rol bx,cl mov dl,bl and dl,0fh cmp dl,9 jbe next1 add dl,07h next1: add dl,30h mov ah,02h int 21h dec ch

jnz roll RET

DISP ENDP

CODE ENDS

END START

三、实验环境

PC机,DOS操作系统

汇编实验报告

四、算法描述及实验步骤

五、调试过程

六、实验结果

七、总结

附录(程序):

相关推荐