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斯特林缓冲区。

代码?结束

结束?开始?;这是编译的结尾