汇编实验报告

更新时间:2024-01-28 03:24:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

姓名

中南大学

实验报告

学生姓名 学 号 专业班级

指导教师 贺建飚老师

学 院 信息科学与工程学院完成时间 2015年6月15日

汇编实验报告

1 | 34

班级

汇编程序设计

班级 姓名 汇编实验报告

目录

实验报告........................................................................................................................................... 1 1

汇编语言实验一 ....................................................................................................................... 3 1.1 实验目的 ....................................................................................................................... 3 1.2 实验要求 ....................................................................................................................... 3 1.3 实验编程 ....................................................................................................................... 3 1.4 DEBUG 命令: .............................................................................................................. 4 1.5 总结与心得 ................................................................................................................... 5 汇编语言实验二 ....................................................................................................................... 6 2.1 实验目的 ....................................................................................................................... 6 2.2 实验要求 ....................................................................................................................... 6 2.3 起泡排序算法的程序实现 ........................................................................................... 6

2.3.1 实验原理及流程图 ........................................................................................... 6 2.3.2 程序源码: ....................................................................................................... 7 2.3.3 DEBUG截图: ................................................................................................ 8 2.3.4 总结与心得 ..................................................................................................... 14 2.4 二进制到十六进制转换程序 ..................................................................................... 14

2.4.1 程序源码 ......................................................................................................... 14 2.4.2 运行结果截图 ................................................................................................. 16 2.4.3 总结与心得 ..................................................................................................... 16 实验三 求Fibonacci递归数 ................................................................................................. 16 3.1 实验目的: ................................................................................................................. 16 3.2 实验要求: ................................................................................................................. 16 3.3 实验内容 ..................................................................................................................... 16 3.4 实验原理及流程图 ..................................................................................................... 17 3.5 程序源码 ..................................................................................................................... 18 3.6 运行结果截图 ............................................................................................................. 27 3.7 总结与心得 ................................................................................................................. 27 实验四 分类统计字符个数 ................................................................................................... 28 4.1 实验目的 ..................................................................................................................... 28 4.2 实验要求 ..................................................................................................................... 28 4.3 实验内容 ..................................................................................................................... 28 4.4 实验原理 ..................................................................................................................... 28 4.5 程序源码 ..................................................................................................................... 28 4.6 运行结果截图 ............................................................................................................. 34 4.7 总结与心得 ................................................................................................................. 34

2

3

4

2 | 34

班级 姓名 汇编实验报告

1 汇编语言实验一

1.1 实验目的

学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,熟悉DEBUG调试程序和DOS功能表的查看,为后续实验打下坚实基础。

1.2 实验要求

通过实验掌握下列知识: 1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG 2、DEBUG命令: A,D,E,F,H,R,T,U。

3、ASCII码及用16进制数表示二进制码的方法。

4、8086寄存器: AX,BX,CX,DX,F,IP。

1.3 实验编程

'Hello World'程序: DATAS SEGMENT

STRING DB 13,10,'Hello World!',13,10,'$' DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS START:

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

MOV AH,4CH INT 21H CODES ENDS

END START

3 | 34

班级 姓名 汇编实验报告

1.4 DEBUG 命令:

1、打 DEBUG 进入 DEBUG,显示提示苻 '_ '。

2、退出DEBUG命令:Q

退出

3、显示内存命令:D 起始地址 结束地址

4、修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。

5、检查寄存器命令:R

6、修改寄存器命令:R 寄存器名

7、小汇编命令:A 起始地址,不输入指令打回车键退出A命令。

4 | 34

班级 姓名 汇编实验报告

8、反汇编命令:U 起始地址 结束地址

9、文件命名命令:N 盘号:文件名 10、读文件命令:L 内存地址 11、写文件命令:W 内存地址

10、读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数 11、写扇区命令:W 内存地址 盘号 扇区号 扇区数

以上我直接再MASM界面内写代码,文件的读写我还不太清楚 12、运行命令:G=起始地址 结束(断点)地址

13、单步命令:T=起始地址 运行指令数,进入子程序内部。

14、单步命令:P=起始地址 运行指令数,不进入子程序内部。

1.5 总结与心得

这次实验的代码直接再示例里就有完整代码,不需要自己写,学习了程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,熟悉DEBUG调试程序和DOS功能表的查看,以为后续实验打下坚实基础。

5 | 34

班级 姓名 汇编实验报告

2 汇编语言实验二

2.1 实验目的

(1) 掌握循环程序的设计方法

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。 (4) 学会针对不同的问题,选用不同的组织循环的方法。

2.2 实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

2.3 起泡排序算法的程序实现 2.3.1 实验原理及流程图

循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:

① 循环初始化。它包括设置循环次数的初始值、地址指针的初始设置等。

② 循环体。这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。修改部分包括地址指针的修改、循环控制条件的修改等。

③ 循环控制部分。它是控制循环的关键,判断循环条件满足与否。

特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。 以下为冒泡算法的流程图:

6 | 34

班级 姓名 汇编实验报告

开始 初始化循环次数?DI 置内循环次数?CX 置地址指针 Ai≥Ai+1 Ai?Ai+1 NY 修改地址指针指向下一元素 修改内循环次数CX-1?CX NCX=0? 修改外循环次数DI-1Y?DI NDI=0? 结束 Y 2.3.2 程序源码:

STACKSG SEGMENT STACK 'S'

DW 64 DUP('ST')

STACKSG ENDS DATA SEGMENT ARY DW 5,7,1,4,3,6,9,8,2 ;数组,流程图中为A CT

EQU

($-ARY)/2

;元素个数

DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACKSG MAIN

PROC FAR

MOV AX,DATA

7 | 34

班级 姓名 汇编实验报告

MOV MOV

LOP1:

MOV MOV

LOP2:

MOV CMP JGE

DS,AX DI,CT-1 CX,DI BX,0

;初始化外循环次数 ;置内循环次数 ;置地址指针

AX,ARY[BX]

AX,ARY[BX+2] ;两数比较 CONT

;次序正确转

XCHG MOV

CONT:

ADD

AX,ARY[BX+2] ;次序不正确互换位置 ARY[BX],AX BX,2 LOP2 DI

;修改地址指针 ;内循环控制 ;修改外循环次数 ;外循环控制

LOOP DEC JNZ

LOP1

MAIN CODE

MOV INT ENDP ENDS END

AX,4C00H 21H

MAIN

2.3.3 DEBUG截图:

(1)初始化外循环次数(DI)=0008H

(2)置内循环次数和地址指针

8 | 34

班级 姓名 汇编实验报告

(3)第一趟第一次比较,因为5<7,故互换位置,进行下一次比较

(4)修改地址指针,继续内循环

(5)第一趟第二次比较,因为5>1,故直接更改地址指针,进行下一次比较

9 | 34

班级 姓名 汇编实验报告

(6)第一趟第三次比较,因为1<4,故互换位置,进行下一次比较

(7)第一趟第四次比较,因为1<3,故互换位置,进行下一次比较

(8)第一趟第五次比较,因为1<6,故互换位置,进行下一次比较

10 | 34

班级 姓名 汇编实验报告

(9)第一趟第六次比较,因为1<9,故互换位置,进行下一次比较

(10)第一趟第七次比较,因为1<8,故互换位置,进行下一次比较

(11)第一趟第八次比较,因为1<2,故互换位置

11 | 34

班级 姓名 汇编实验报告

(12)第一趟循环结束,最小数1被交换至数组的最后位置

(13)第二趟循环结束,次小数2被交换至数组的倒数第二个位置

(14)第三趟循环结束,数字3归位

12 | 34

班级 姓名 汇编实验报告

(15)第四趟循环结束,数字4归位

(16)第五趟循环结束,数字5归位

(17)第六趟循环结束,数字6归位

(18)第七趟循环结束,数字7归位

(19)第八趟循环结束,数字8归位,第九趟循环结束,数字9归位 同上,不截图了

(20)排序结束,程序退出

13 | 34

班级 姓名 汇编实验报告

2.3.4 总结与心得

1. 在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设置,对整个程序的执行逻辑要非常清楚,这样可以避免死循环等意外情况的出现。

2. 多层循环的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。同时要对照流程图,随时观察代码的逻辑思路是否正确。 3. 当要观察排序结果时,可利用D命令,显示数据段的内容,检查程序是否正常运行。

这个实验我花了很多心思去做,包括DEGUG时将每一步的目的、作用都分析清楚,我感学这样做让我更加了解了循环结构和汇编语言的特点。

2.4 二进制到十六进制转换程序 2.4.1 程序源码

PROGNAM SEGMENT ;DEFINE CODE SEGMENT MAIN PROC FAR ASSUME CS:PROGNAM START:

PUSH DS ;SAVE OLD DATA SEGMENT SUB AX,AX ;PUT 0 IN AX

14 | 34

班级 姓名 PUSH AX

MOV CH,4

ROTATE:MOV CL,4; ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,7H PRINTIT: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE RET MAIN ENDP

PROGNAM ENDS

汇编实验报告

15 | 34

班级 姓名 汇编实验报告

END

2.4.2 运行结果截图

2.4.3 总结与心得

我做的是一个把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。用循环结构把NX内的内容从左至右没四组为一组在屏幕上显示出来即可,其中还涉及到二进制到所显示为字符的ASCII之间的转换,以及每个字符的显示。总体比较简单,看书很快完成。

3 实验三 求Fibonacci递归数

3.1 实验目的:

掌握子程序的设计方法,熟悉递归程序的设计

3.2 实验要求:

掌握递归程序的调用、返回及入口、出口的传递方法

3.3 实验内容

程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数 Fibonacci数的公式如下:

Fib(1)=1;当n=1 Fib(2)=1;当n=2

Fib(n)=Fib(n-1)+Fib(n-2)

16 | 34

班级 姓名 3.4 实验原理及流程图

简单来说,完成如下要求: 1.显示提示,并接受一个数字N; 2.调用fib递归 得到结果存入内存; 3.调用显示10进制函数OUTPUT。

具体流程图如下:

开始 CALL INPUT CALL FIB CALL OUTPUT 结束

汇编实验报告

17 | 34

班级 姓名 3.5 程序源码

DATAS SEGMENT

STR1 DB 'Please input a number(1-50):N=','$' STR2 DB 13,10,'FIB(N)=','$'

WRONGSTR DB 13,10,13,10,'A number between 1 and 50 please!',13,10,13,10,'$'

INPUTBUFFER DB 3,?,3 DUP(?) N DW ? ;输入N值 RESULT1H DW 0 RESULT1L DW 0

RESULT2H DW 0 ;结果的高16位 RESULT2L DW 0 ;结果的低16位 C10 DW 10

OUTPUTBUFFER DB 11 DUP('0') DATAS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS START:

MOV AX,DATAS MOV DS,AX CALL INPUT CALL FIB

汇编实验报告

18 | 34

班级 姓名 CALL OUTPUT JMP QUIT

;*********************************************************************** INPUT PROC

JMP T1

WRONG:LEA DX,WRONGSTR MOV AH,9

INT 21H

T1:LEA DX,STR1 MOV AH,9

INT 21H

LEA DX,INPUTBUFFER MOV AH,10 INT 21H MOV AX,0

MOV CL,INPUTBUFFER+1 MOV CH,0

LEA BX,INPUTBUFFER+2

T2:MUL C10 MOV DL,[BX] CMP DL,'0'

汇编实验报告

19 | 34

班级 姓名 JB WRONG CMP DL,'9' JA WRONG AND DL,0FH ADD AL,DL ADC AH,0 INC BX LOOP T2 CMP AX,0032H JA WRONG CMP AX,1 JB WRONG MOV N,AX RET INPUT ENDP

;************************************************************ FIB PROC CMP N,1 JZ L1 CMP N,2 JZ L2

DEC N

汇编实验报告

20 | 34

班级 姓名 CALL FIB

MOV AX,RESULT2L MOV DX,RESULT2H MOV CX,RESULT1L ADD RESULT2L,CX MOV CX,RESULT1H ADC RESULT2H,CX MOV RESULT1L,AX MOV RESULT1H,DX

JMP EXIT

L1:MOV RESULT1L,1 MOV RESULT2L,1 JMP EXIT L2:MOV RESULT2L,1 DEC N CALL FIB EXIT:RET FIB ENDP

;************************************************************* OUTPUT PROC MOV AX,RESULT2L

LEA SI,OUTPUTBUFFER

汇编实验报告

21 | 34

班级 姓名 汇编实验报告

MOV CX,5

R1:MOV DX,0 ;低位加入OUTPUTBUFFER DIV C10 INC SI ADD [SI],DL

LOOP R1

;************************* MOV AX,RESULT2H LEA SI,OUTPUTBUFFER MOV CX,5 R2:MOV DX,0 DIV C10 INC SI

PUSH CX CMP DX,0 JE NOADD MOV CX,DX ADDN:CALL ADD65536 LOOP ADDN NOADD:POP CX LOOP R2 ;**********************

;高位加入OUTPUTBUFFER 22 | 34

班级 姓名 LEA DX,STR2 MOV AH,9

INT 21H

LEA SI,OUTPUTBUFFER MOV BX,10

R3:CMP BYTE PTR [SI+BX],'0' JA PRINT

DEC BX ;显示十进制结果 JMP R3

PRINT:MOV DL,[SI+BX]

MOV AH,2 INT 21H DEC BX CMP BX,1

JAE PRINT

RET

OUTPUT ENDP

;************************************************************ ADD65536 PROC

;高位算法

ADD BYTE PTR [SI],6 MOV DL,0

CMP BYTE PTR [SI],3AH

汇编实验报告

23 | 34

班级 姓名 JB A1

SUB BYTE PTR [SI],10 MOV DL,1

A1:ADD BYTE PTR [SI+1],3 ADD BYTE PTR [SI+1],DL MOV DL,0

CMP BYTE PTR [SI+1],3AH JB A2

SUB BYTE PTR [SI+1],10 MOV DL,1

A2:ADD BYTE PTR [SI+2],5 ADD BYTE PTR [SI+2],DL MOV DL,0

CMP BYTE PTR [SI+2],3AH JB A3

SUB BYTE PTR [SI+2],10 MOV DL,1

A3:ADD BYTE PTR [SI+3],5 ADD BYTE PTR [SI+3],DL MOV DL,0

CMP BYTE PTR [SI+3],3AH JB A4

汇编实验报告

24 | 34

班级 姓名 SUB BYTE PTR [SI+3],10 MOV DL,1

A4:ADD BYTE PTR [SI+4],6 ADD BYTE PTR [SI+4],DL MOV DL,0

CMP BYTE PTR [SI+4],3AH JB A0

SUB BYTE PTR [SI+4],10 MOV DL,1

A5:ADD BYTE PTR [SI+5],DL MOV DL,0

CMP BYTE PTR [SI+5],3AH JB A0

SUB BYTE PTR [SI+5],10 MOV DL,1

A6:ADD BYTE PTR [SI+6],DL MOV DL,0

CMP BYTE PTR [SI+6],3AH JB A0

SUB BYTE PTR [SI+6],10 MOV DL,1

A7:ADD BYTE PTR [SI+7],DL

汇编实验报告

25 | 34

班级 姓名 MOV DL,0

CMP BYTE PTR [SI+7],3AH JB A0

SUB BYTE PTR [SI+7],10 MOV DL,1

A8:ADD BYTE PTR [SI+8],DL MOV DL,0

CMP BYTE PTR [SI+8],3AH JB A0

SUB BYTE PTR [SI+8],10 MOV DL,1

A9:ADD BYTE PTR [SI+9],DL A0:RET ADD65536 ENDP ;********************** QUIT:MOV AH,4CH INT 21H CODES ENDS END START

汇编实验报告

26 | 34

班级 姓名 汇编实验报告

3.6 运行结果截图

输入数据 36(十进制)

输出数据 14930352(10进制) 正确。

3.7 总结与心得

本实验使我进一步掌握汇编子程序的设计方法,熟悉递归程序的设计,丰富了我写汇编程序的经验。

实验代码虽然很长,但思路还是很简单的,先是程序接收用户输入的1小于等于50的十进制正整数,存入输入缓冲区后再把它转化为十六进制数,存入内存单元N中。调用FIB函数求Fibonacci数,结果高位存在RESULT2H,低位存在RESULT2L,最后调用OUTPUT函数将结果以十进制的形式显示出来。程序亮点在于将结果转换为十进制时采用了除10取余的方法,对于高位通过在适当的位数加65536(ADD65536)的方式巧妙地将乘法转化为加法。

27 | 34

班级 姓名 汇编实验报告

4 实验四 分类统计字符个数

4.1 实验目的

掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧

4.2 实验要求

掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序

4.3 实验内容

程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:aaabb1234&中,字母5,数字4,其他字符1)

4.4 实验原理

计算机中字符以ASCII码的形式存储,DOS 21H的0AH功能调用可以把键入字符直接送到缓冲区中,然后再逐个取出分类计数。也可以采用01H功能调用,在接收字符后,先分类计数,然后再存入缓冲区中。

程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其它字符分类统计数, 然后将结果存入以letter、digit和other为名的存储单元中。

4.5 程序源码

DATAS SEGMENT

STRING1 DB 'Input Your String: $';输入提示信息 STRING2 DB 'Digit: $' ;各类字符提示信息 STRING3 DB 'Letter: $'

28 | 34

班级 姓名 STRING5 DB 'Others: $' DIGIT DB 0 ;数字

CHARS DB 0 ;字母 OTHERS DB 0 ;其他 DATAS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX

LEA DX,STRING1 ;显示输入提示信息 MOV AH,9 INT 21H

MOV CX,100 ;设置循环次数足够大

L1:MOV AH,1 ;中断调用,单字符输入 INT 21H

CMP AL,0DH ;若输入回车符则结束

汇编实验报告

29 | 34

班级 姓名 JZ OVER2

CMP AL,30H

JB OTHER ;若<30H(0),OTHERS++ CMP AL,39H ;若>39H(9),跳转进一步比较 JA HIGHER1

JMP DIGITAL ;DIGIT++

HIGHER1: CMP AL,41H ;if<41H(A),OTHERS++ JB OTHER

CMP AL,5AH ;if>5AH(Z),跳转继续比较 JA HIGHER2

JMP CHAR ;ALPHAU++

HIGHER2: CMP AL,61H ;if<61H(a),OTHERS++ JB OTHER

CMP AL,7AH ;if>7AH(z),OTHERS++ JA OTHER

JMP CHAR ;ALPHAL++ JMP OVER ;比较结束

OTHER: INC OTHERS ;OTHERS++

汇编实验报告

30 | 34

班级 姓名 JMP OVER

DIGITAL: INC DIGIT ;DIGIT++ JMP OVER

CHAR: INC CHARS ;ALPHAL++ JMP OVER

JMP OVER OVER:NOP

LOOP L1 ;循环,输入下一字符

OVER2:CALL ENDLINE ;回车换行 LEA DX,STRING2 ;输出提示信息 MOV AH,9 INT 21H XOR AX,AX

MOV AL,DIGIT ;将统计的数字送AX,为输出做准备CALL DISPLAY ;调用输出两位数字的子程序

CALL ENDLINE ;下同 LEA DX,STRING3 MOV AH,9 INT 21H

汇编实验报告

31 | 34

班级 姓名 XOR AX,AX MOV AL,CHARS CALL DISPLAY CALL ENDLINE

LEA DX,STRING5 MOV AH,9 INT 21H XOR AX,AX MOV AL,OTHERS CALL DISPLAY MOV AH,4CH INT 21H

ENDLINE PROC NEAR ;控制输出格式,输出回车换行子程序MOV AH,2 MOV DL,0AH INT 21H MOV AH,2 MOV DL,0DH INT 21H RET

汇编实验报告

32 | 34

班级 姓名 ENDLINE ENDP

DISPLAY PROC NEAR ;输出两位数字的子程序 MOV BL,10 ;10送BL

DIV BL ;AX/BL,AL=商,AH=余数 PUSH AX ;保存AX中的信息 MOV DL,AL ADD DL,30H MOV AH,2

INT 21H ;输出十位数 POP AX ;出栈送AX MOV DL,AH ADD DL,30H MOV AH,2

INT 21H ;输出个位数 RET

DISPLAY ENDP CODES ENDS END START

汇编实验报告

33 | 34

班级 姓名 汇编实验报告

4.6 运行结果截图

测试数据:taday is 2015/06/15 数字:8 字母:7 其他:4 正确

4.7 总结与心得

本次实验要求我们学会用分支程序设计进行程序编程,其中运用到许多跳转和比较指令,只要细心一点,理清思路就能很容易的将本程序编写出来。

34 | 34

本文来源:https://www.bwwdw.com/article/abnw.html

Top