XRD汇编真题
;?标题来源:/question/132613879 . html。
;?操作说明:
;?1,源文件名或目标文件名,必须遵守DOS下的文件名命名规则;
;?2.这个程序必须在保护模式下运行。
;?3.命令格式:copyxx?filepath1?文件路径2
;?这个程序在MASMPlus?在1.2集成环境下编译调试,运行正确。
代码?段
AssumeCS:代码,DS:代码
;?-
;?函数:显示指定地址的字符串(Str_Addr)
;?入口:
;?Str_Addr= =字符串地址(数据段中需要)
;?用法:?输出?Str _地址
;?用法示例:Output?PromptStr
OutputMACRO宏?Str _地址
leadx,字符串地址
movah,9岁
int21h
EndM
;?-
Addr_Filedw?,;文件名字符串地址
Handle_Filedw?,;文件代码
Prompt_Str1?' db13,10,10,'这个?来源?文件?是吗?不是吗?存在。$'
Prompt_Str2?db13,10,10,'无效?路径。$'
Prompt_Str3?db13,10,10,'字符?开?指挥?线?是吗?没有吗?还是?也是?很少。$'
Prompt_Str4?db13,10,10,'无效?参数。$'
Prompt_Str5?' db13,10,10,10,' The?文件?有吗?去过吗?复制。$'
Press_Keydb7,13,10,10,'按?有吗?钥匙?去哪?出口...$'?
开始:pushcs
popds
movah,2fh?;获取当前DTA地址(命令行参数地址)
int21h
movcl,字节?ptr?es:[bx]
cmpcl,4
jaeNext0?;命令行参数是多余的或等于4个字符。转到分解和处理参数。
输出?Prompt_Str3?;提示:命令行参数中的字符太少。
jmpExit_Proc?;结束程序
下一个0:推送
popds
pushcs
教皇
xorch,ch
pushcx
leasi,[bx][2]
leadi,文件名
cld
repmovsb
popcx
pushcs
popds
leadi,文件名
moval,20h
repzscasb?;查找源文件名字符串地址
jnznex 1
无效_Para:?输出?Prompt_Str4?;提示:无效的命令行参数。
jmpExit_Proc?;结束程序
Next1:leabx,[di-1]
movAddr_File,bx?;保存源文件名字符串地址
repnz?scasb?;找到源文件名字符串的结束地址
jnzInvalid_Para
movBYTE?ptr?[di-1],0?;源文件名字符串终止符
repzscasb?;找到目标文件名字符串地址
jzInvalid_Para
cmpBYTE?ptr?[di-1],0dh
jzInvalid_Para
leabx,[di-1]
movAddr_File[2],bx?;保存目标文件名字符串地址
repnz?scasb?;找到目标文件名字符串的结束地址
movBYTE?ptr?[di-1],0?;目标文件名字符串终止符
movdx,Addr_File?;源文件名字符串地址
Open_File:?movax,3d40h?;打开源文件
int21h
jc$+8
movHandle_File,ax?;保存源文件代码
jmpTarget_File
cmpax,5
jzOpen_File?;如果访问被拒绝,请再次尝试打开该文件。
cmpax,2
jnzNext2
输出?Prompt_Str1?;提示:文件不存在。
jmpExit_Proc
下一个2:cmpax,3
jnzTarget_File
输出?Prompt_Str2?;提示:路径无效。
jmpExit_Proc
目标_文件:?movdx,Addr_File[2]?;目标文件名字符串地址
xorcx,cx
创建_文件:?movah,3ch?;创建目标文件
int21h
jncNext3
cmpax,3
jnzCreate_File
输出?Prompt_Str2?;提示:路径无效。
jmpExit_Proc
Next3:movHandle_File[2],ax?;保存目标文件代码
leadx,文件名?;文件内容缓冲区
movcx,0ffc0h?;预留32个字的堆栈空间。
subcx,dx?;设置一次读写文件内容的字节数。
movbp,cx?;暂时储存某物
读_文件:?movcx,bp
movbx,Handle_File?;读取源文件代码
movah,3fh?;读取文件内容
int21h
jcRead_File?;无法读取文件。试着再读一遍。
测试ax,ax
jzClose_File?;如果实际读取的字节数为0,则读写操作结束,关闭源文件和目标文件。
movbx,Handle_File[2]?;读取目标文件代码
movcx,ax
写_文件:?movah,40h?;写文件
int21h
jcWrite_File?;无法写入文件,请尝试再次写入。
jmpRead_File
关闭_文件:?movbx,Handle_File?;读取源文件代码
movah,3eh?;关闭文档
int21h
movbx,Handle_File[2]?;读取目标文件代码
movah,3eh?;关闭文档
int21h
输出?Prompt_Str5?;提示:文件已被复制。
;?-
退出_过程:?输出?按_键?;提示操作完成,按任意键结束程序。
movah,1
int21h
movah,4ch?;结束程序
int21h
File _ Namedb斯特林缓冲区。
代码?结束
结束?开始?;这是编译的结尾