三级pc上机指导.docx
《三级pc上机指导.docx》由会员分享,可在线阅读,更多相关《三级pc上机指导.docx(28页珍藏版)》请在冰豆网上搜索。
三级pc上机指导
B上机考试内容
B.1考题格式
根据上机考试要求,既要考察上机操作和编程能力,又要便于计算机规格化考试与评分,全国计算机等级考试三级PC技术上机考题的一般格式如下所示,考生只要在BEGIN和END区间根据考题要求完成编程或填充必要的指令,或修改整个程序中存在的错误,然后进行汇编、连接并运行程序,最终产生正确的结果,即可以达到上机考试目的。
;PROG1.ASM
EXTRNLOAD:
FAR,SAVE:
FAR
NEQU20;需输入的字节数
DSEGSEGMENT;数据段
SOURCEDWNDUP(?
);存放原始数据
RESULTDWNDUP(0);存放运算结果
NAME0DB'INPUT1.DAT',0;输入文件名
NAME1DB'OUTPUT1.DAT',0;输出文件名
DSEGENDS
SSEGSEGMENTSTACK;堆栈段
DB128DUP(?
)
SSEGENDS
CSEGSEGMENT;代码段
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
STARTPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
LEADX,SOURCE;原始数据区首址送DX
LEASI,NAME0;输入文件名首址送SI
MOVCX,2*N;输入字节数送CX
CALLLOAD;从"INPUT1.DAT"中读取数据
;****BEGIN****
┅;考生在此区间编程、完形填充
┅
;****END****
LEADX,RESULT;结果数据区首址送DX
LEASI,NAME1;结果文件名首址送SI
MOVCX,N*2;结果字节数送CX
CALLSAVE;保存结果到OUTPUT1.DAT
RET
STARTENDP
CSEGENDS
ENDSTART
上面的程序定名为PROG1.ASM,程序中用到的LOAD和SAVE子程序由IO.OBJ提供,它们的功能与入出口参数说明如下:
⑴LOAD(FAR)
功能:
从磁盘文件读取原始数据到内存缓冲区
入口:
DS:
SI文件名首指针(文件名要求以00H结束)
DS:
DX内存缓冲区首址
CX要读入的字节数
出口:
CX实际读入的字节数
若出现文件操作错误,则显示错误信息后中止程序运行
⑵SAVE(FAR)
功能:
将内存中程序运行结果存入磁盘文件
入口:
DS:
SI文件名首指针(文件名要求以00H结束)
DS:
DX内存缓冲区首址
CX要输出的字节数
出口:
CX实际输出的字节数
若出现文件操作错误,则显示错误信息后中止程序运行
因此,当PROG1.ASM经过汇编得到PROG1.OBJ文件以后,必须与IO.OBJ文件连接,才能生成PROG1.EXE文件。
需要说明的是,源程序经汇编、连接以后,即使没有发现错误,也不能说明运行PROG1.EXE一定会得到正确的结果。
这是因为汇编、连接正确,只能说明语法没有错误,编程算法是否正确还需要进一步验证。
如果不符合要求,必须利用DEBUG或TD动态程序调试工具,跟踪程序的执行,检查程序中的问题,最后才能得到满意的结果。
注意,经过上述汇编、连接以及调试后得到的PROG1.EXE文件必须再一次运行,才能提供输出文件OUTPUT1.DAT,否则计算机无法进行评分。
B.2考题类型
1.编制程序
这种题型是根据考题要求,在BEGIN和END区间自行编制程序,然后进行汇编、连接,并运行程序,最后得到正确结果。
下面是一个编制程序的例子,题目要求是:
内存中连续存放着二十个字(WORD),对每个字逻辑左移,使其最高位为1,其中值为零的不变。
例如:
内存中有29C1H(0010100111000001B),0000H,134BH,...
结果为A704H(1010011100000100B),0000H,9A58H,...
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
下面是程序清单,其中BEGIN和END之间的程序段由考生编写。
;PROG1.ASM
EXTRNLOAD:
FAR,SAVE:
FAR
NEQU20;需输入的字节数
DSEGSEGMENT;数据段
SOURCEDWNDUP(?
);存放原始数据
RESULTDWNDUP(0);存放运算结果
NAME0DB'INPUT1.DAT',0;输入文件名
NAME1DB'OUTPUT1.DAT',0;输出文件名
DSEGENDS
SSEGSEGMENTSTACK;堆栈段
DB128DUP(?
)
SSEGENDS
CSEGSEGMENT;代码段
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
STARTPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
LEADX,SOURCE;原始数据区首址送DX
LEASI,NAME0;输入文件名首址送SI
MOVCX,2*N;输入字节数送CX
CALLLOAD;从INPUT1.DAT中读取数据
;****BEGIN****
LEASI,SOURCE;原始数据首地址送SI
MOVDI,OFFSETRESULT;结果数据首地址送DI
MOVCX,N;字节数送CX
NEXT:
MOVAX,[SI];取一个字数据
CMPAX,0;是0吗?
JESKIP;是,跳过这一个字
LOOP1:
TESTAX,8000H;否,最高位是1吗?
JNESKIP;是,跳过这一个字
SHLAX,1;否,左移一位
JMPLOOP1;继续测试最高位是否为1
SKIP:
MOV[DI],AX;保存变换结果于RESULT中
ADDSI,2;修改原始数据区指针
ADDDI,2;修改结果数据区指针
LOOPNEXT;继续检查下一个字数据
;****END****
LEADX,RESULT;结果数据区首址送DX
LEASI,NAME1;结果文件名首址送SI
MOVCX,N*2;结果字节数送CX
CALLSAVE;保存结果到OUTPUT1.DAT
RET
STARTENDP
CSEGENDS
ENDSTART
2.完形填充
这种题型是在BEGIN和END区间已经编写了部分程序,但其中有些指令不完整,或者缺少某些指令,考生应根据考题要求,在程序的空白处填写合适的内容,使程序能正常汇编、连接,并获得正确的运行结果。
当然,考生也不一定受提供程序的限制,可以修改或删除程序中的指令,甚至改变BEGIN和END中程序的结构,只要使程序运行后能够得到考题所提出的功能要求即可。
下面是一个完形填空的程序例子,题目要求是:
内存中有一个由十六个字(WORD)组成的数组(SOURCE)和一个字变量L。
试将L作为逻辑尺对数组SOURCE进行下列处理:
如L的第i位为0,则数组的第i个数不变;
如L的第i位为1,则数组的第i个数按位取反。
字L的位序从低到高依次为0至15,数组下标依次从0到15。
例如:
L=0009H,数组为139CH,89C6H,5437H,8819H,...
变换为EC63H,89C6H,5437H,77E6H,...
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入(L在前,SOURCE在后)。
运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
在BEGIN和END之间已给出的源程序中填充,填充的地方已经用横线标出,每处一般只需填写指令的一部分或一条完整的指令,但功能相当的多条指令亦可。
此外,考生也可以修改或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
;PROG1.ASM
EXTRNLOAD:
FAR,SAVE:
FAR
NEQU16
DSEGSEGMENT
LDW?
SOURCEDWNDUP(?
)
RESULTDWNDUP(0)
NAME0DB'INPUT1.DAT',0
NAME1DB'OUTPUT1.DAT',0
DSEGENDS
SSEGSEGMENTSTACK
DB128DUP(?
)
SSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
STARTPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
LEADX,L;数据区起始地址
LEASI,NAME0;原始数据文件名
MOVCX,2*(N+1);字节数
CALLLOAD;从INPUT1.DAT中读取数据
;****BEGIN****
LEASI,SOURCE
_________________;填写指令LEADI,RESULT
MOVCX,N
MOVDX,____;填写源操作数1
L0:
MOVAX,[SI]
____L,DX;填写指令助记符TEST
____STORE;填写指令助记符JZ
NOTAX
STORE:
MOV[DI],AX
ADDDI,2
ADDSI,2
________________;填写指令SHLDX,1
LOOPL0
;****END****
LEADX,RESULT;结果数据区首址
LEASI,NAME1;结果文件名
MOVCX,2*N;结果字节数
CALLSAVE;保存结果到OUTPUT1.DAT
RET
STARTENDP
CSEGENDS
ENDSTART
3.修改错误
这种题型是在程序中设置了若干错误,考生应根据题目要求,修改程序中的错误,使程序能正常汇编、连接,并获得正确的运行结果。
下面是一个修改程序错误的例子,题目要求是:
内存中从SOURCE开始连续存放着二十个字(WORD),试统计每个字中二进制位为1的个数,结果以字节存放。
例如:
内存中有139CH,5B8CH,1489H,...
结果为07H,08H,05H,...
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
修改源程序中的错误,使程序运行后能够获得考题所提出的运行结果。
;PROG1.ASM
EXTRNLOAD:
FAR,SAVE:
FAR
NEQU20
DSEGSEGMENT
SOURCEDWNDUP(?
)
RESULTDWNDUP(0)
NAME0DB'INPUT1.DAT',0
NAME1DB'OUTPUT1.DAT',0
DSEGENDS
SSEGSEGMENTSTACK
DB128;错误1
SSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
START:
PROCFAR;错误2
PUSHDS
XORAX,AX
PUSHAX
MOVDS,DSEG;错误3
LEADX,SOURCE;数据区起始地址
LEASI,NAMEO;错误4
MOVCX,2*N;字节数
CALLLOAD;从INPUT1.DAT中读取数据
LEASI,SOURCE
CLD
MOVDX,N
LOOP0:
LODSSOURC
XORBX,BX
MOVCX,16
LOOP1:
ROLAX,1
JNCNEXT
INCBX
NEXT:
LOOPLOOP0;错误5
MOVDESULT,BL;错误6
INCDI
DECDX
JNZLOOP0
LEADX,RESULT;结果数据区首址
LEASI,NAME1;结果文件名
MOVCX,N;结果字节数
CALLSAVE;保存结果到OUTPUT1.DAT
RET
STARTENDP
CSEGENDS
ENDSTART
上面的程序中设置了六种类型的错误,其错误性质是:
错误1,虽然这条伪指令语句没有语法错误,但这样设计是不合理的,因为该语句只是在堆栈中存放了一个字节的数据,也就是说,堆栈空间只有一个字节的大小,因此执行本程序时显然是不够用的,当程序执行后必然会出现不可预料的结果。
错误2,根据伪指令语句格式要求,伪指令名后面没有冒号,因此该语句非法。
错误3,根据传送指令的要求,立即数不能直接传送给段寄存器。
也就是说,为了对段寄存器初始化,必须先把立即数送到某通用寄存器,然后再由通用寄存器把立即数送到段寄存器,才能达到对段寄存器初始化之目的。
错误4,由于该指令把NAME0误写成NAMEO,汇编时找不到变量名NAMEO,因而指出NAME0未定义,只要将NAMEO改写为NAME0即可。
错误5,这条语句没有语法错误,但这样设计目标地址不能获得考题规定的运算结果,必须将目标地址LOOP0改为LOOP1,程序运算结果才会正确。
碰到这种类型的错误,考生应仔细阅读程序,彻底理解每一条指令在程序中所起的作用,才能改正这种类型的错误。
错误6,该指令错误的性质是操作数类型不匹配,因为目的操作数为字变量,而源操作数为8位寄存器。
因此,为了使操作数类型匹配,应将BL寄存器改为BX寄存器,或者将RESULT改为字节变量。
需要说明的是,考生在识别错误时首先应充分利用汇编和连接软件工具检查程序中的语法错误,然后再通过调试与运行,验证程序设计中使用的指令以及算法的正确性。
否则,面临众多的隐藏错误,将一定会感到束手无策。
C开发汇编语言程序的常用工具软件
汇编语言与其他计算机语言一样,对程序的开发一般都要经过编辑、汇编(编译)、连接、以及运行与调试四个阶段。
因而,开发汇编语言程序的常用工具软件也应该包括编辑软件,汇编软件,连接软件,以及动态程序调试软件。
下面分别介绍这些软件的基本功能和使用方法。
C.1编辑软件
微软公司提供的EDIT是当前比较常用的文本编辑软件,启动该软件的命令格式是:
Edit[filename]
若启动时没有输入文件名,则该编辑软件启动后除了在屏幕的顶部和底部分别显示主菜单和操作说明外,Untitle表明编辑的是无标题文件,屏幕中部显示软件开发公司及版本信息,用户可以通过F1键获得各种编辑命令的使用说明,若需要返回编辑窗口,只要按ESC键即可。
该编辑软件的一般操作步骤如下:
·按ALT键,激活主菜单。
这时,屏幕顶部五个菜单项(File、Edit、Search、Options和Help)的第一个字母变为高亮度。
·键入高亮度字母键或单击鼠标左键即可直接激活指定的菜单项和命令。
·用键盘的方向键可使光标在菜单和命令之间移动。
当移到所需要的地方按回车或单击鼠标左键,即可显示菜单命令或执行指定的命令。
·按F1键,可获得当前所选菜单、命令或对话框的有关帮助信息。
若需退出帮助信息窗口,按ESC键即可。
注意,经编辑产生的汇编语言源程序必须用.ASM作为扩展名,否则下一步进行汇编时将不予承认。
C.2汇编与连接软件
汇编语言程序设计中,用于汇编与连接的软件一般有两种:
其一是微软公司开发的的MASM和LINK软件,其二是Borland公司开发的TASM和TLINK软件。
下面分别介绍这两种软件在汇编语言程序开发过程中使用的基本方法。
1.MASM和LINK
通过上述编辑产生汇编语言源程序后,就可以用宏汇编程序MASM对它进行汇编。
具体操作过程是,在DOS状态下键入MASM并回车,于是屏幕上首先显示软件的版本号,然后依次提出四个问题,如下所示:
SourceFilename[.ASM]:
Sample
ObjectFilename[Sample.OBJ]:
SourceListing[Nul.LST]:
Sample
CrossReference[Nul.CRF]:
Sample
第一行询问汇编语言源程序名。
用户输入文件名后(例如Sample),则显示第二个提示,询问目标程序的文件名,括号内为机器默认的文件名,通常直接回车,表示采用默认的文件名。
接着出现第三个提示,提示是否要建立列表文件,该文件列出汇编后的目标代码以及与其有关的地址、源语句和符号表,可供打印输出。
若需要这个文件则输入该文件名并回车。
接着出现第四个提示,询问是否要建立交叉引用文件,该文件是一个中间文件,可供CREF.EXE程序建立一个扩展名为.REF的引用表文件,以便用户了解源程序中符号和变量的引用情况。
若需要则输入文件名,若不需要则直接回车。
下面是生成.REF文件的操作步骤。
C>CREF
CrefFilename[.CRF]:
Sample
ListFilename[Sample.REF]:
当用户回答了第四个询问后,汇编程序就对源程序进行汇编。
若汇编过程中发现源程序中有语法错误,则列出有错误的语句和错误的代码,并且指出是什么性质的错误和错误的总数。
此时可分析错误,然后再调用编辑程序加以修正。
修正后重新汇编,直至汇编完全正确为止。
为了使汇编后产生的.OBJ文件生成可执行的.EXE文件,还必须由LINK程序将已经生成的.OBJ文件与其他.OBJ文件或程序库进行连接操作。
具体连接过程是,在DOS状态下键入LINK并回车,于是屏幕上首先显示软件的版本号,然后依次提示四个问题,如下所示:
ObjectModules[.OBJ]:
Sample
RunFile[Sample.EXE]:
ListFile[Nul.MAP]:
Sample
Libraries[.LIB]:
第一行询问要连接的目标文件名,用户输入文件名(例如Sample)作为回答。
如果有多个要连接的目标文件,应一次输入,各目标文件名之间用“+”号相连。
第二个提示询问要产生的可执行文件名,一般直接回车就采用了括号内默认的文件名。
第三个提示询问是否产生扩展名为MAP的输出文件,这是一个连接程序的列表文件,又称为连接映象,它给出每个段在存储器中的分配情况。
若需要这个文件,则输入文件名再回车,否则直接回车。
最后提示是否用到库文件,要求用户输入源程序访问的库文件名。
所谓库文件,就是若干可重定位的目标代码的集合,它可以由库管理程序LIB.EXE建立和修改。
若没有库文件,则直接输入回车即可。
程序在连接过程中若出现错误,则显示有关错误信息。
例如:
Warning:
NoStackSegment
Therewas1errordetected
有错误就要重新调用编辑程序进行修改,然后重新汇编、连接,直至没有错误为止。
2.TASM和TLINK
TASM与MASM有类似的功能,启动TASM汇编程序的命令格式是:
TASMfileset1[;fileset2]
此命令行中,TASM可以跟有若干个fileset,其中每个fileset使用的格式是:
[option]sourcefile[[+]sourcefile][,[objfile][,[listfile][,[xreffile]]
该格式表明,一个文件组可以包含选项(option)及若干被汇编的文件名。
其中,选项用来控制汇编程序如何操作以及如何输出信息等。
关于每一个选项的具体说明,用户可以简单地输入命令TASM,然后回车,就可以从屏幕上清楚地看到它们的含义,这里不再赘述。
例如,当前目录下有一个汇编语言源文件PROG1,可以用下面的命令行对它进行汇编:
TASMPROG1
如果PROG1.ASM正确,将在屏幕上显示以下信息:
TurboAssemblerVersion1.0Copyright(c)1988,1996,byBorlandInternational,Inc.
Assemblingfile:
PROG1.ASM
Errormessages:
None
Warningmessanges:
None
Passes:
1
Remainingmemory:
439K
如果有警告或错误信息,将显示出错的行号。
这时,应该重新编辑、汇编,直至没有错误为止。
需要说明的是,输入命令行TASMPROG1时,不需要键入扩展名,因为TASM认为所有被汇编的文件均带有扩展名.ASM。
此外,如果未指定其他目标文件名,则汇编程序默认生成的目标文件与源程序同名,不同的只是扩展名为.OBJ,即PROG1.OBJ。
下面是汇编多个文件或命令行简写的几个例子。
1.TASMFILE1+FILE2;汇编多个文件,文件间用“+”号连接
2.TASM/eFILE1;/aFILE2;用不同的选项汇编不同的文件,它们之间用分号作
;为分隔符。
3.TASM*;汇编当前目录下所有.ASM文件。
4.TASMFILE?
;汇编当前目录下,所有5个字符长的文件名中,包含
;FILE的.ASM文件。
5.TASMFILE1,,TEST;接受缺省的目标文件名,即FILE1.OBJ,并生成列表
;文件TEST.LST。
6.TASMFILE1,,,MYXREF;接受缺省的目标文件名FILE1.OBJ和列表文件名
;FILE1.LST,但交叉引用文件名为MYXREF.XRF。
7.TASMXX*,YY*;用通配符指示源文件和目标文件。
例如,当前目录
;下有源文件XX1.ASM和XX2.ASM,生成的目标文件名
;为YY1.OBJ和YY2.OBJ。
8.TASMFILE1,,NUL,;用NUL指示不需要生成的文件,此时汇编生成
;FILE1.OBJ和FILE1.XRF,但不生成.LST列表文件。
与LINK软件的使用方法类似,TLINK程序用来连接目标程序,生成可执行的.EXE文件,其一般命令行格式如下所示:
TLINK[options]objfiles,exefile,[mapfile],[libfiles][deffile],[resfiles]
其中:
options是TLINK的选项,用来控制TLINK的操作。
例如,是否要产生.EXE文件或.DLL文件等等。
注意,使用选项时必须用斜线(/)或连字符(-)作为前导。
若要取消缺省的选项,可在选项后面加一个连字符,例如,-P-将取消选项P的作用。
关于每一个选项的具体说明,用户可以简单地输入命令TLINK,然后回车,就可以从屏幕上清楚地看到它们的含义,这里不再赘述。
objfiles是被连接的目标文件名,如果不在当前目录,应提供目录路径。
exefile是需要产生的可执行文件名,扩展名为.EXE或.DLL。
如果没有提供文件名,TLINK用第一个目标文件