📄 asm.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 bh,1fh
mov cx,0
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 + -