中南大学
计算机原理与汇编
实验报告
题目: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