1、DSEG,SS:SSEGSTART PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX LEA DX,SOURCE ;原始数据区首址送DX LEA SI,NAME0 ;输入文件名首址送SI MOV CX,2*N ;输入字节数送CX CALL LOAD ;从INPUT1.DAT中读取数据 * BEGIN * ;考生在此区间编程、完形填充 * END * LEA DX,RESULT ;结果数据区首址送DX LEA SI,NAME1 ;结果文件名首址送SI MOV CX,N*2 ;结果字节数送CX CALL SAVE ;保存结果到OUTP
2、UT1.DAT RETSTART ENDPCSEG ENDS END START上面的程序定名为PROG1.ASM,程序中用到的LOAD和SAVE子程序由IO.OBJ提供,它们的功能与入出口参数说明如下: LOAD(FAR) 功能:从磁盘文件读取原始数据到内存缓冲区 入口:DS:SI 文件名首指针(文件名要求以00H结束) DS:DX 内存缓冲区首址 CX 要读入的字节数 出口:CX 实际读入的字节数 若出现文件操作错误,则显示错误信息后中止程序运行 SAVE(FAR)将内存中程序运行结果存入磁盘文件 CX 要输出的字节数CX 实际输出的字节数因此,当PROG1.ASM经过汇编得到PROG1.
3、OBJ文件以后,必须与IO.OBJ文件连接,才能生成PROG1.EXE文件。需要说明的是,源程序经汇编、连接以后,即使没有发现错误,也不能说明运行PROG1.EXE一定会得到正确的结果。这是因为汇编、连接正确,只能说明语法没有错误,编程算法是否正确还需要进一步验证。如果不符合要求,必须利用DEBUG或TD动态程序调试工具,跟踪程序的执行,检查程序中的问题,最后才能得到满意的结果。注意,经过上述汇编、连接以及调试后得到的PROG1.EXE文件必须再一次运行,才能提供输出文件OUTPUT1.DAT,否则计算机无法进行评分。B.2考题类型1.编制程序这种题型是根据考题要求,在BEGIN和END区间自
4、行编制程序,然后进行汇编、连接,并运行程序,最后得到正确结果。下面是一个编制程序的例子,题目要求是:内存中连续存放着二十个字(WORD),对每个字逻辑左移,使其最高位为1,其中值为零的不变。例如:内存中有 29C1H(0010100111000001B),0000H,134BH,.结果为 A704H(1010011100000100B),0000H,9A58H,.部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。下面是程序清单,其中BEGIN和END之间的
5、程序段由考生编写。,0 ;从INPUT1.DAT中读取数据; LEA SI,SOURCE ;原始数据首地址送SI MOV DI,OFFSET RESULT ;结果数据首地址送DI MOV CX,N ;字节数送CXNEXT: MOV AX,SI ;取一个字数据 CMP AX,0 ;是0吗? JE SKIP ;是,跳过这一个字LOOP1: TEST AX,8000H ;否,最高位是1吗? JNE SKIP ; SHL AX,1 ;否,左移一位 JMP LOOP1 ;继续测试最高位是否为1SKIP: MOV DI,AX ;保存变换结果于RESULT中 ADD SI,2 ;修改原始数据区指针 ADD
6、DI,2 ;修改结果数据区指针 LOOP NEXT ;继续检查下一个字数据 结果数据区首址送DX 结果文件名首址送SI 结果字节数送CX 保存结果到OUTPUT1.DAT2.完形填充这种题型是在BEGIN和END区间已经编写了部分程序,但其中有些指令不完整,或者缺少某些指令,考生应根据考题要求,在程序的空白处填写合适的内容,使程序能正常汇编、连接,并获得正确的运行结果。当然,考生也不一定受提供程序的限制,可以修改或删除程序中的指令,甚至改变BEGIN和END中程序的结构,只要使程序运行后能够得到考题所提出的功能要求即可。下面是一个完形填空的程序例子,题目要求是:内存中有一个由十六个字(WORD
7、)组成的数组(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之间已给
8、出的源程序中填充,填充的地方已经用横线标出,每处一般只需填写指令的一部分或一条完整的指令,但功能相当的多条指令亦可。此外,考生也可以修改或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。N EQU 16DSEG SEGMENTL DW ?RESULT DW N DUP(0),0SSEG SEGMENT STACKCSEG SEGMENT LEA DX,L ;数据区起始地址原始数据文件名 MOV CX,2*(N+1) ;字节数 LEA SI,SOURCE _ ;填写指令LEA DI,RESULT MOV CX,N MOV DX,_ ;填写源操作数1L0: MOV AX,SI _
9、L,DX ;填写指令助记符TEST _ STORE ;填写指令助记符JZ NOT AXSTORE: MOV DI,AX ADD DI,2 ADD SI,2 _ ;填写指令SHL DX,1 LOOP L0结果数据区首址结果文件名结果字节数3.修改错误这种题型是在程序中设置了若干错误,考生应根据题目要求,修改程序中的错误,使程序能正常汇编、连接,并获得正确的运行结果。下面是一个修改程序错误的例子,题目要求是:内存中从SOURCE开始连续存放着二十个字(WORD),试统计每个字中二进制位为1的个数,结果以字节存放。 内存中有 139CH,5B8CH,1489H,. 结果为 07H, 08H, 05H
10、,.修改源程序中的错误,使程序运行后能够获得考题所提出的运行结果。FAR N EQU 20,0 DB 128 ;错误1START: PROC FAR ;错误2 MOV DS,DSEG ;错误3 LEA SI,NAMEO ;错误4 CLD MOV DX,NLOOP0: LODS SOURC XOR BX,BX MOV CX,16 ROL AX,1 JNC NEXT INC BX LOOP LOOP0 ;错误5 MOV DESULT,BL ;错误6 INC DI DEC DX JNZ LOOP0上面的程序中设置了六种类型的错误,其错误性质是:错误1,虽然这条伪指令语句没有语法错误,但这样设计是不合
11、理的,因为该语句只是在堆栈中存放了一个字节的数据,也就是说,堆栈空间只有一个字节的大小,因此执行本程序时显然是不够用的,当程序执行后必然会出现不可预料的结果。错误2,根据伪指令语句格式要求,伪指令名后面没有冒号,因此该语句非法。错误3,根据传送指令的要求,立即数不能直接传送给段寄存器。也就是说,为了对段寄存器初始化,必须先把立即数送到某通用寄存器,然后再由通用寄存器把立即数送到段寄存器,才能达到对段寄存器初始化之目的。错误4,由于该指令把NAME0误写成NAMEO,汇编时找不到变量名NAMEO,因而指出NAME0未定义,只要将NAMEO改写为NAME0即可。错误5,这条语句没有语法错误,但这样
12、设计目标地址不能获得考题规定的运算结果,必须将目标地址LOOP0改为LOOP1,程序运算结果才会正确。碰到这种类型的错误,考生应仔细阅读程序,彻底理解每一条指令在程序中所起的作用,才能改正这种类型的错误。错误6,该指令错误的性质是操作数类型不匹配,因为目的操作数为字变量,而源操作数为8位寄存器。因此,为了使操作数类型匹配,应将BL寄存器改为BX寄存器,或者将RESULT改为字节变量。需要说明的是,考生在识别错误时首先应充分利用汇编和连接软件工具检查程序中的语法错误,然后再通过调试与运行,验证程序设计中使用的指令以及算法的正确性。否则,面临众多的隐藏错误,将一定会感到束手无策。C 开发汇编语言程
13、序的常用工具软件汇编语言与其他计算机语言一样,对程序的开发一般都要经过编辑、汇编(编译)、连接、以及运行与调试四个阶段。因而,开发汇编语言程序的常用工具软件也应该包括编辑软件,汇编软件,连接软件,以及动态程序调试软件。下面分别介绍这些软件的基本功能和使用方法。C.1编辑软件微软公司提供的EDIT是当前比较常用的文本编辑软件,启动该软件的命令格式是:Edit filename若启动时没有输入文件名,则该编辑软件启动后除了在屏幕的顶部和底部分别显示主菜单和操作说明外,Untitle表明编辑的是无标题文件,屏幕中部显示软件开发公司及版本信息,用户可以通过F1键获得各种编辑命令的使用说明,若需要返回编
14、辑窗口,只要按ESC键即可。该编辑软件的一般操作步骤如下:按ALT键,激活主菜单。这时,屏幕顶部五个菜单项(File、Edit、Search、Options和Help)的第一个字母变为高亮度。键入高亮度字母键或单击鼠标左键即可直接激活指定的菜单项和命令。用键盘的方向键可使光标在菜单和命令之间移动。当移到所需要的地方按回车或单击鼠标左键,即可显示菜单命令或执行指定的命令。按F1键,可获得当前所选菜单、命令或对话框的有关帮助信息。若需退出帮助信息窗口,按ESC键即可。注意,经编辑产生的汇编语言源程序必须用.ASM作为扩展名,否则下一步进行汇编时将不予承认。C.2 汇编与连接软件汇编语言程序设计中,
15、用于汇编与连接的软件一般有两种:其一是微软公司开发的的MASM和LINK软件,其二是Borland公司开发的TASM和TLINK软件。下面分别介绍这两种软件在汇编语言程序开发过程中使用的基本方法。1. MASM和LINK通过上述编辑产生汇编语言源程序后,就可以用宏汇编程序MASM对它进行汇编。具体操作过程是,在DOS状态下键入MASM并回车,于是屏幕上首先显示软件的版本号,然后依次提出四个问题,如下所示:Source Filename .ASM:SampleObject Filename Sample.OBJ:Source Listing Nul.LST:Cross Reference Nul
16、.CRF:第一行询问汇编语言源程序名。用户输入文件名后(例如Sample),则显示第二个提示,询问目标程序的文件名,括号内为机器默认的文件名,通常直接回车,表示采用默认的文件名。接着出现第三个提示,提示是否要建立列表文件,该文件列出汇编后的目标代码以及与其有关的地址、源语句和符号表,可供打印输出。若需要这个文件则输入该文件名并回车。接着出现第四个提示,询问是否要建立交叉引用文件,该文件是一个中间文件,可供CREF.EXE程序建立一个扩展名为.REF的引用表文件,以便用户了解源程序中符号和变量的引用情况。若需要则输入文件名,若不需要则直接回车。下面是生成.REF文件的操作步骤。CCREF Cre
17、f Filename .CRF:Sample List Filename Sample.REF: 当用户回答了第四个询问后,汇编程序就对源程序进行汇编。若汇编过程中发现源程序中有语法错误,则列出有错误的语句和错误的代码,并且指出是什么性质的错误和错误的总数。此时可分析错误,然后再调用编辑程序加以修正。修正后重新汇编,直至汇编完全正确为止。为了使汇编后产生的.OBJ文件生成可执行的.EXE文件,还必须由LINK程序将已经生成的.OBJ文件与其他.OBJ文件或程序库进行连接操作。具体连接过程是,在DOS状态下键入LINK并回车,于是屏幕上首先显示软件的版本号,然后依次提示四个问题,如下所示:Obj
18、ect Modules .OBJ:Run File Sample.EXE:List File Nul.MAP:Libraries .LIB:第一行询问要连接的目标文件名,用户输入文件名(例如Sample)作为回答。如果有多个要连接的目标文件,应一次输入,各目标文件名之间用“”号相连。第二个提示询问要产生的可执行文件名,一般直接回车就采用了括号内默认的文件名。第三个提示询问是否产生扩展名为MAP的输出文件,这是一个连接程序的列表文件,又称为连接映象,它给出每个段在存储器中的分配情况。若需要这个文件,则输入文件名再回车,否则直接回车。最后提示是否用到库文件,要求用户输入源程序访问的库文件名。所谓库
19、文件,就是若干可重定位的目标代码的集合,它可以由库管理程序LIB.EXE建立和修改。若没有库文件,则直接输入回车即可。程序在连接过程中若出现错误,则显示有关错误信息。Warning: No Stack SegmentThere was 1 error detected有错误就要重新调用编辑程序进行修改,然后重新汇编、连接,直至没有错误为止。2.TASM和TLINKTASM与MASM有类似的功能,启动TASM汇编程序的命令格式是:TASM fileset1 ;fileset2此命令行中,TASM可以跟有若干个fileset,其中每个fileset使用的格式是:option sourcefile+
20、sourcefile,objfile,listfile,xreffile该格式表明,一个文件组可以包含选项(option)及若干被汇编的文件名。其中,选项用来控制汇编程序如何操作以及如何输出信息等。关于每一个选项的具体说明,用户可以简单地输入命令TASM,然后回车,就可以从屏幕上清楚地看到它们的含义,这里不再赘述。例如,当前目录下有一个汇编语言源文件PROG1,可以用下面的命令行对它进行汇编:TASM PROG1如果PROG1.ASM正确,将在屏幕上显示以下信息:Turbo Assembler Version 1.0 Copyright (c) 1988,1996,by Borland Int
21、ernational,Inc.Assembling file: PROG1.ASMError messages: NoneWarning messanges:Passes: 1Remaining memory: 439K如果有警告或错误信息,将显示出错的行号。这时,应该重新编辑、汇编,直至没有错误为止。需要说明的是,输入命令行TASM PROG1时,不需要键入扩展名,因为TASM认为所有被汇编的文件均带有扩展名.ASM。此外,如果未指定其他目标文件名,则汇编程序默认生成的目标文件与源程序同名,不同的只是扩展名为.OBJ,即PROG1.OBJ。下面是汇编多个文件或命令行简写的几个例子。1. TA
22、SM FILE1+FILE2 ;汇编多个文件,文件间用“+”号连接2. TASM /e FILE1;/a FILE2 ;用不同的选项汇编不同的文件,它们之间用分号作 ;为分隔符。3. TASM * ;汇编当前目录下所有.ASM文件。4. TASM FILE?汇编当前目录下,所有5个字符长的文件名中,包含FILE的.ASM文件。5. TASM FILE1,TEST ;接受缺省的目标文件名,即FILE1.OBJ,并生成列表文件TEST.LST。6. TASM FILE1,MYXREF ;接受缺省的目标文件名FILE1.OBJ和列表文件名FILE1.LST,但交叉引用文件名为MYXREF.XRF。7
23、. TASM XX*,YY* ;用通配符指示源文件和目标文件。例如,当前目录下有源文件XX1.ASM和XX2.ASM,生成的目标文件名为YY1.OBJ和YY2.OBJ。8. TASM FILE1,NUL, ;用NUL指示不需要生成的文件,此时汇编生成FILE1.OBJ和FILE1.XRF,但不生成.LST列表文件。与LINK软件的使用方法类似,TLINK程序用来连接目标程序,生成可执行的.EXE文件,其一般命令行格式如下所示:TLINK options objfiles,exefile,mapfile,libfilesdeffile,resfiles其中:options是TLINK的选项,用来控制TLINK的操作。例如,是否要产生.EXE文件或.DLL文件等等。注意,使用选项时必须用斜线(/)或连字符(-)作为前导。若要取消缺省的选项,可在选项后面加一个连字符,例如,-P-将取消选项P的作用。关于每一个选项的具体说明,用户可以简单地输入命令TLINK,然后回车,就可以从屏幕上清楚地看到它们的含义,这里不再赘述。objfiles是被连接的目标文件名,如果不在当前目录,应提供目录路径。exefile是需要产生的可执行文件名,扩展名为.EXE或.DLL。如果没有提供文件名,TLINK用第一个目标文件
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1