⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm.sub

📁 1、汇编课程设计 2、包括如下:(1)、简单文件管理 (2)、学生成绩管理 (3)、简单加法器 3、文档中附有代码
💻 SUB
字号:
;
;***********************************
;以下函数供课题一 二和三的源程序
;调用
;个函数的功能和入口参数 返回值将
;逐个说明
;***********************************

;-----------------------------------
;功能:格式化打印ax中的无符号数
;入口参数:ax=要打印的数
;         bh=00 左对齐
;         bh=01 右对齐
;         bl=要占的格数
;返回值:  屏幕显示
printf 	proc	near
	push 	cx
	push	dx
	push	bx
	mov	dx,0
	cmp	ax,10000
	jb	Four
	mov	dl,5
	jmp	next1
    	Four:
	cmp	ax,1000
	jb	Three
	mov	dl,4
	jmp	next1
    	Three:
	cmp	ax,100
	jb	Two
	mov	dl,3
	jmp	next1
    	Two:
	cmp	ax,10
	jb	One
	mov	dl,2
	jmp	next1
    	One:
	mov	dl,1
    	next1:
	cmp	dl,bl
	jnb	print_frist
	sub	bl,dl
	mov	cl,bl
	cmp	ch,0
	je	left
	call	space
	call	print
	jmp	end_printf
    	left:
	call	print
	call	space
	jmp	end_printf
    	print_frist:
	call	print
    	end_printf:
	pop	bx
	pop	dx
	pop	cx
	ret
print	proc	near
	push	cx
	mov	bx,0
	mov	cx,10000
	call	div_ax
	mov	cx,1000
	call	div_ax
	mov	cx,100
	call	div_ax
	mov	cx,10
	call	div_ax
	add	al,30h
	mov	dl,al
	mov	ah,2
	int	21h
	pop	cx
	ret
div_ax	proc	near
	mov	dx,0
	div	cx
	mov	cx,dx
	cmp	bx,0
	jne	next2
	cmp	ax,0
	je	end_div
	mov	bx,1
	jmp	next2
    	next2:
	mov	dl,al
	add	dl,30h
	mov	ah,2
	int	21h
    	end_div:
	mov	ax,cx
	ret
div_ax	endp
print	endp
space	proc	near
	push	ax
	mov	ah,2
	mov	dl,' '
	loop_space:
	int	21h
	loop loop_space
	pop	ax
	ret
space	endp
printf	endp

;--------------------------------
;功能:屏幕上卷 初始化
;入口参数:al=00初始化
;         al=n上卷n行
;输出值:  屏幕显示
scrn	proc	near
	mov	ah,06h
	mov	bh,71h
	mov	cx,0
	mov	dx,184fh
	int	10h
	ret
scrn	endp
;--------------------------------
;同上  入口参数多:
;bh=要上卷或初始化的颜色值
scrn_bx  proc   near
	mov	ah,06h
	mov	cx,0
	mov	bh,1fh
	mov	dx,184fh
	int	10h
	ret
scrn_bx	endp
;---------------------------------
;功能: 设定光标位置
;需数据段定义row和col
curs	proc	near
	mov	ah,02
	mov	bh,0
	mov	dh,row
	mov	dl,col
	int	10h
	ret
curs	endp
;-------------------------------
;功能:接受一个字符
;入口参数:无
;返回值:  al=字符ASCII码
getch	proc	near
	mov	ah,01
	int	21h
	ret
getch	endp
;-------------------------------
;功能:用0清除缓冲区多余的字节
;入口参数:di=缓冲区地址
;         cl=缓冲区大小(字节)
;         ch=缓冲区已占空间(字节)
;返回值:  缓冲区未被使用的字节被0
;         填满
nam_clear proc	near
	push	di
	mov	al,0
	push	dx
	mov	dh,0
	mov	dl,ch
	add	di,dx
	pop	dx
	sub	cl,ch
	mov	ch,0
	cld
	rep 	stosb
	pop	di
	ret
nam_clear	endp
;------------------------------
nam_clear_dl	proc	near
;同上:缓冲区未被使用的空间被
;     空格填满
	push	di
	mov	al,' '
	push	dx
	mov	dh,0
	mov	dl,ch
	add	di,dx
	pop	dx
	sub	cl,ch
	mov	ch,0
	cld
	rep	stosb
	pop	di
	ret
nam_clear_dl	endp	
;----------------------------------
nam_in_open	proc	near
	;输入文件名
	;检查文件是否存在 若存在则打开
	;入口参数:
	;     dl=文件名起始地址
	;     al=打开文件的方式
	;返回参数:
	;     打开正确 返回ax=文件代号
	;     文件不存在或错误 返回ax=0000
	jmp	begin_in
	errorin_open	db 10,13
	     db 'File does.not exist.!','$'
	begin_in:
	push	di
	mov	di,dx
	add	di,2
	mov	ah,0ah
	int	21h
	mov	bx,dx
        	add     bx,1
	mov	ch,[bx]
	mov	cl,30
	call	nam_clear
	;
	mov	dx,di
	mov	ah,3dh
	int	21h
	jnc	begin_exit
	push	ds
	mov	ax,seg	errorin_open
	mov	ds,ax
	lea	dx,errorin_open
	mov	ah,09h
	int	21h
	pop	ds
	mov	ax,0000
	pop	di
	ret
	;
	begin_exit:
	pop	di
	ret
nam_in_open	endp
;---------------------------------
;功能:    关闭文件
;入口参数:bx=文件名地址a
closefile	proc	near
	mov	ah,3eh
	int	21h
	ret
closefile	endp
;--------------------------------
;功能:  接受键盘输入的10进制数
;       到ax中
;入口参数: 无
;返回值 :ax=接受到的数
scanf proc near
	push	bx
	push	cx
	push	dx
	mov	bx,0
	sf_newchar:
	call	getch
	sub	al,30h
	cmp	al,0
	jb	sf_exit
	cmp	al,09
	ja	sf_exit
	cbw
	xchg	ax,bx
	mov	cx,10	
	mul	cx
	xchg	ax,bx
	add	bx,ax
	jmp	sf_newchar
	sf_exit:
	mov	ax,bx
	pop	dx
	pop	cx
	pop	bx
	ret
scanf	endp
;--------------------------------------------
inf_in_file proc	near
	;功能:  写文件并检查错误
	;入口参数:dx=缓冲区地址;
	;	   cx=写入的字节数;
	;	   bx=文件代号
	jmp	in_next
	error_in    db	10,13
              db   '[!]ERROR IN WRITE FILE.','$'
	in_next:
	mov	ah,40h	
	int	21H
	jnc	in_exit
	push	ds
	mov	dx,seg	error_in
	mov	ds,dx
	lea	dx,error_in
	mov	ah,09h
	int	21h
	pop	ds
	mov	ax,0000
	in_exit:
	ret
inf_in_file endp
;-------------------------------------------
newfile	proc	near
	;功  能:新建一文件 做覆盖检查
	;入口参数:dx=文件名起始偏移地址
	;返回 值:返回ax=文件代号
	jmp	newfile_begain
	error_newfile	db 10,13
		db '[!]File has been exist.'
		db 'Rewrite it?[Y\N]:','$'
	newfile_begain:
	push	di
	mov	di,dx
	add	di,2;di-->filename
	mov	bx,dx
	mov	ah,0ah
	int	21h;  输入文件名
        add     bx,1
	mov	cl,30   ;容许最大长度
	mov	ch,[bx] ;实际长度
	call	nam_clear;
	mov	al,00   ;用读方式打开
	mov	ah,3dh
	mov	dx,di
	int	21h     ;看文件是否存在
        jc      next_st;不存在可以直接建立
	mov	bx,ax  ;存在先关闭文件
        call    closefile
	push	ds;已存在该文件 是否覆盖
	;-----------------
	mov	ax,seg error_newfile
	mov	ds,ax
	lea	dx,error_newfile
	mov	ah,09h
	int	21h
	pop 	ds
	;-----------------
	call	getch  ;默认不覆盖
	cmp	al,'y'
	je	next_st;同意覆盖
	cmp	al,'Y'
	je	next_st;同意覆盖
	
	mov	ax,0000;不同意覆盖
	pop 	di	
	ret	       ;返回0000
	next_st:
        mov     dx,di;使dx指向文件名
	mov	cx,0000;普通方式建文件
	mov	ah,3ch
	int	21h    ;建立文件
	pop	di
	ret       ;ax=文件代号  
newfile	endp
;-------------------------------------
	
	
	
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -