文档库 最新最全的文档下载
当前位置:文档库 › 汇编实验报告

汇编实验报告

汇编实验报告
汇编实验报告

中南大学

计算机原理与汇编

实验报告

题目:1,5,6

姓名:胡松

学号:0909123006

专业:物联网工程1202班

二○一四年六月

实验一 (3)

1.问题描述

2.模块功能

3.调试与测试

4.测试结果

5.心得体会

6.附录

实验二 (7)

7.问题描述

8.模块功能

9.调试与测试

10.测试结果

11.心得体会

12.附录

实验三 (10)

1.问题描述

2.模块功能

3.调试与测试

4.测试结果

5.心得体会

实验一

一、问题描述

从键盘输入年份,通过计算后,输出该年份是否为闰年的信息。

判断闰年的规则是:如果某一年能被4整除但不能被100整除或者该

年能被400整除,则该年为闰年。

二、程序模块功能,程序设计组成框图、流程图。

三、调试与测试。

四、测试结果,用几组测试数据进行测试算法设计的正确性。

五、本次课程设计的心得体会。

学习是一个不断积累和反思的过程,不论是掌握一门技术还是学好一门课程都不是一蹴而就的,汇编作为最底层的语言之一,比高级语言学习起来更困难。因此,今后还是要不断学习,勤动手勤思考,虚心问教。

六、附录:源程序清单和结果。

DATA SEGMENT ;数据段.

MSG1 DB 13, 10, 'Please Input : $'

VAR1 DB 13, 10, 'THE YEAR IS LEAP!','$' VAR2 DB 13, 10, 'THE YEAR IS NOT LEAP!','$' MSG3 DB 13, 10, 'Input ERROR. $'

x DW ? ;年份:0~65535

B DW 4

G DW 400

F DW 100

DATA ENDS

;----------------------------------------------

CODE SEGMENT ;代码段.

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

;--------------------------------

MOV DX, OFFSET MSG1 ;提示Please Input : MOV AH, 9

INT 21H

;--------------------------------

IN_LOOP:

MOV x, 0 ;数据清零.

;MOV CX, 4 ;输入4位

_INX:

PUSH CX

MOV AH, 1 ;输入单个字符.

INT 21H

CMP AL,13

JE L

;--------------------------------

CMP AL, '0'

JB _IN_ERR ;小于'0',不是数字.

CMP AL, 3AH

JB SUB_30H ;'0'~'9'.

;--------------------------------

_IN_ERR: ;大于'9',也不是数字.

MOV DX, OFFSET MSG3 ;提示Input ERROR.

MOV AH, 9

INT 21H

JMP EXIT ;转到结束程序.

;--------------------------------

SUB_30H:

SUB AL, '0' ;还原为数字.

MOV AH, 0

MOV CX, AX ;暂存新数据.

MOV AX, x

MOV BX, 10 ;老数据乘以10

MUL BX

ADD AX, CX ;加上新数据.

MOV x, AX ;保存.

POP CX

LOOP _INX ;继续输入.

;--------------------------------

L:

MOV AX, x ;取来刚刚输入的年份

CWD ;拓展为32位

DIV B ;除以4

CMP DX, 0 ;余数为0?

JNZ L1 ;非0,就不是闰年

;--------------------

MOV AX, x

CWD

DIV G ;除以400

CMP DX, 0

JZ L2 ;余数为0,就是闰年

;--------------------

MOV AX, x

CWD

DIV F ;除以100

CMP DX, 0

JNZ L2 ;余数非0,就是闰年

;--------------------

L1:

MOV DX, OFFSET VAR2 ;显示:THE YEAR IS NOT LEAP!

JMP _O_STR

L2:

MOV DX, OFFSET VAR1 ;显示:THE YEAR IS LEAP!

_O_STR:

MOV AH, 09H ;显示

INT 21H

;--------------------------------

EXIT:

MOV AH, 4CH

INT 21H

;--------------------------------

CODE ENDS

END START

实验二

一、问题描述

反向输出一个整数。(如原整数为34512,输出21543)。

二、程序模块功能,程序设计组成框图、流程图。

三、调试与测试。

四、测试结果,用几组测试数据进行测试算法设计的正确性。

五、本次课程设计的心得体会。

学习是一个不断积累和反思的过程,不论是掌握一门技术还是学好一门课程都不是一蹴而就的,汇编作为最底层的语言之一,比高级语言学习起来更困难。因此,今后还是要不断学习,勤动手勤思考,虚心问教。

六、附录:源程序清单和结果。

data segment

sources db 100,?,100 dup(?)

targets db 100 dup(?),'$'

data ends

code segment

assume cs:code,ds:data

main :

mov ax,data

mov dx,offset sources

mov ah,0ah ;键盘输入至缓冲区

int 21h

mov ah,2 ;显示一个字符,DL为待输出字符的ASCII码

mov dl,0dh ;将输入的字符转换成ASCII码

int 21h

mov dl,0ah ;

int 21h

lea si,sources ;将输入的字符串首地址赋给si

inc si ;si+1

mov cl,[si]

mov ch,0

add si,cx

lea di,targets

again: mov al,[si]

mov [di],al

dec si

inc di

loop again

lea dx,targets ;将倒序后的字符串首有效地址放在DX中

mov ah,9 ;字符串输出

int 21h

mov ah,4ch ;带返回码结束

code ends

end main

code ends

end start

实验三

一、问题描述

编写一拷贝程序,要求在命令行指定源文件名和目标文件名。

二、程序模块功能,程序设计组成框图、流程图。

三、调试与测试。

三、测试结果,用几组测试数据进行测试算法设计的正确性。

五、本次课程设计的心得体会。

汇编课程是一门理论性和实践性都很强的课程,通过亲自编写算法、上机运行和调试程序,才能加深理解和掌握所学的知识,提高程序设计和软件研发能力,所以自己做好了思想准备,这次课程设计必须独立的完成。

六、附录:源程序清单和结果。

.model small

.stack 64

.data

;-------------------------------------------

handle dw ? ;源文件代号

filenampl label byte;同一个地址赋予两个不同的变量名

maxlen db 30 ;最大长度

namlen db ? ;文件长度

filenam db 30 dup(?) ;文件名

nam_end db '$'

fileend db 0 ;文件结束标志

chandle dw ? ;目标文件代号

filelen dw ? ;文件长

onechar db ?

menu db 10,13,10,13,10,13,' ***************Main Menu************ ',10,13 ;主菜单

db ' *** A. File Copy *** B. Exit *** ',10,13

db ' ********************************** ',10,13

db ' Please input your choice A or B',10,13,'$'

copymeg1 db 10,13, ' Please input source file name and path: ','$'

copymeg2 db 10,13, ' Please input destination file name and path: ','$'

copyreturn1 db 10,13,10,13,10,13,' File Copy Success ',10,13,'$'

error1 db 10,13,' File copy failure!','$'

error2 db 10,13,' Your input is error! Please input again!','$'

.code

;-------------------------------------------

;主函数

main proc far

mov a x,@data ;初始化DS

mov d s,ax

mov e s,ax

mainloop: ;主循环

lea dx,menu

mov a h,9

int 21h

call getch

cmp a l,'A'

jb error

cmp a l,'B'

jg error

cmp a l,'B'

je exit

call filecopy

jmp mainloop

error:

lea dx ,error2

mov ah ,09

int 21h

jmp mainloop

exit:

mov a x,4ch

int 21h

main endp

;-------------------------------------------

;功能: 文件拷贝

filecopy proc near

mov filelen,0000;文件长清零

mov f ileend,00 ;文件结束标志清零

lea dx,copymeg1

mov a h,09

int 21h

lea dx,filenampl;dx存放第一个文件缓冲区起始偏移地址mov c l,30 ;cl是缓冲区大小(字节)

mov a l,00 ;al是打开文件的方式

call openfile ;打开源文件

cmp a x,0000

jne nextname ;打开成功

lea dx,error1

mov a h,09

int 21h

ret ;源文件不存在返回主函数nextname: ;读取下一个文件名

mov h andle,ax

lea dx,copymeg2

mov a h,09

int 21h

lea dx,filenampl;dx存放第一个文件缓冲区起始偏移地址call newfile ;新建目标文件

cmp a x,0000

jne copybegin;目标文件创建成功

mov bx,handle

call closefile ;关闭打开的已存在的目标文件

ret ;存在同名文件返回主函数copybegin:

mov c handle,ax;

mov c x,1

lea dx,onechar

again:

mov b x,handle

mov a h,3fh

int 21h ;从源文件读一个字符

cmp a x,0000 ;ax为实际读入的字节数

jne next ;没到文件末尾

mov f ileend,1 ;已是最后一个字符了next:

mov b x,chandle

mov a h,40h

int 21h ;写进目标文件

cmp f ileend,1

je return

inc filelen ;文件字节数加一

jmp again;读下一个字节return: ;拷贝已完成

mov b x,handle

call closefile ;关闭源文件

mov b x,chandle

call closefile ;关闭目标文件

mov a h,09

lea dx,copyreturn1

int 21h

ret

filecopy endp

;-------------------------------------------

;功能:接收一个字符

getch proc near

mov ah,01

int 21h

ret ;返回值:al=字符ASCII码getch endp

;-------------------------------------------

;功能:用0清除缓冲区多余的字节

clear proc near

push di ;入口参数:di是缓冲区地址

mov a l,0

push dx

mov d h,0

mov d l,ch ;入口参数:ch是缓冲区已占空间(字节)

add di,dx

pop dx

sub cl,ch ;入口参数:cl是缓冲区大小(字节)

mov c h,0

cld ;方向标志位置0指令

rep stosb ;重复执行存入串操作,把AL的内容存入剩余的缓冲区pop di

ret ;返回值:缓冲区未被使用的字节被0填满

clear endp

;-------------------------------------------

;功能: 1、输入文件名2、检查文件是否存在若存在则打开

openfile proc near

jmp begin_in

errorin_open db 10,13

db ' Soure file is not exist!','$'

begin_in:

push di ;子程序所需要使用的寄存器内容保存在堆栈中

mov d i,dx

add di,2 ;di-->filenam ,di是文件名起始地址

mov a h,0ah

int 21h ;键盘输入到缓冲区

mov b x,dx

add bx,1

mov c h,[bx] ;实际长度

mov c l,30 ;容许最大长度

call clear

mov d x,di

mov a h,3dh ;打开文件

int 21h

jnc begin_exit ;判断CF中的值是否为0

push ds

mov a x,seg errorin_open

mov d s,ax

lea dx,errorin_open

mov a h,09h

int 21h

pop ds

mov a x,0000

pop di

ret ;文件存在或错误返回ax=0000 begin_exit:

pop di

ret ;打开正确返回ax=文件代号openfile endp

;-------------------------------------------

;功能: 关闭文件

closefile proc near

mov a h,3eh

int 21h

ret

closefile endp

;-------------------------------------------

;功能: 判断文件是否存在,若不存在则新建一文件,若存在则直接返回。newfile p roc near

jmp newfile_begain

error_newfile db 10,13,10,13,' Destination file has been existed!',

10,13,' File copy failure!','$'

newfile_begain:

push di ;子程序所需要使用的寄存器中的内容先保存在堆栈中mov d i,dx ;入口参数:dx是文件名起始偏移地址

add di,2 ;di-->filename

mov b x,dx

mov a h,0ah

int 21h ;输入文件名

add bx,1 ;bx-->namlen

mov c l,30 ;容许最大长度

mov c h,[bx] ;实际长度

call clear;

mov a l,00 ;用读方式打开

mov a h,3dh ;打开文件

mov d x,di

int 21h

jc next_st ;判断CF看文件是否存在,不存在可以直接建立

mov b x,ax ;存在先关闭文件

call closefile

push ds

;-----------------

mov a x,seg error_newfile

mov d s,ax

lea dx,error_newfile

mov a h,09h

int 21h

pop ds

mov ax,0000 ;文件已存在,返回ax=00000

pop di

ret

;-----------------

next_st:

mov dx,di ;使dx指向文件名

mov c x,0000 ;普通方式建文件

mov a h,3ch

int 21h ;建立文件

pop di

ret ;建立文件成功,返回ax=文件代号newfile e ndp

end main

相关文档