1、PC技术机试模拟试卷 47及答案与解析 一、程序设计题 1 请编制程序,其功能是:内存中连续存放着 10个十六位二进制数。分别对每个数的高位字节和低位字节进行逻辑与运算及逻辑或运算。运算结果以字的形式按序连续存放 (低位字节存入逻辑与运算的结果,高位字节存入逻辑或运算的结果 )。 例如: 内存中有: AA55H, 55AAH, FFAAH 结果为: PP00H, FF00H, FFAAH 部分程序已给出,其中原始数据由过程 LOAD从文件 INPUT1.DAT中读入SOURCE开始的内存单元中 。运算结果要求从 RESULT开始存放, 由过程 SAVE保存到文件 OUTPUT1.DAT中。 请
2、填空 BEGIN和 END之间已经给出的源程序使其完整,空白处已经用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和 END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序 EXTRN LOAD: FAR, SAVE: FAR N EQU 3 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT SOURCE DW N DUP(?) RESULT DW N DUP(
3、0) NAME0 DB INPUT1.DAT, 0 NAME1 DB OUTPUT1.DAT, 0 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STAC START PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX LEA DX, SOURCE ;数据区起始地址 LEA SI, NANE0 ;原始数据文件名 MOV CX, N*2 ;字节数 CALL LOAD ;从 INPUT1.DAT中读取数据 ; * BEGIN * MOV DI, OFFSET RESUL
4、T MOV CX, N MOV BX, 00 PRO: MOV AX, (1) MOV DX, AX AND (2) , DH (3) AH, AL MOV (4) , DL ADD BX, 2 (5) ADD DI, 2 (6) JNZ PRO ; * END * LEA DX, RESULT ;结果数据区首址 LEA SI, NAME1 ;结果文件名 NOV CX, N*2 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START PC技术机试模拟 试卷 47答案与解析 一、程序设计题 1 【正确答案】 (1)SOURCEBX
5、 (2)DL (3)OR(4)AL (5)MOV DI, AX (6)DECCX 【试题解析】 该程序的功能是:将每个 16位二进制数的高 8位和低 8位分别进行逻辑 “与 ”运算和逻辑 “或 ”运算,并将运算结果以字的形式按序连续存放,低字节存放逻辑 “与 ”运算的结果,高字节存放逻辑 “或 ”运算的结果。 程序的堆栈段定义了一个 128字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据 区 SOURCE和结果数据区 RESULT:两个字节型变量:原始数据文件名 NAME0和结果数据文件名 NAME1。数据段下面是代码段,在代码段的开始告诉汇编程序,代码段、数据段和堆栈段
6、分别属于段寄存器 CS、DS、 SS。 在程序的开始部分,是对返回地址的保存和数据段寄存器的初始化,这是每一个汇编程序所必须具有的操作步骤。然后调用外部过程 LOAD,从 “INPUT1.DAT”中读取数据。准备工作完成以后,程序进入主体部分。 首先将结果数据偏移地址传送给 DI, CX赋初值为 N,原始数据偏移地址 BX赋初值为 0。在 PRO段,将 SOURCEBX中的内容送 AX,所以第 (1)空填写“SOURCEBX”。接着将 AX中的数据送 DX暂存,将 DL和 DH中的内容 (即 16位二进制数的高 8位和低 8位的值 )进行逻辑 “与 ”操作,结果存放于 DL中,所以第 (2)空
7、填写 “DL”。然后将 AH和 AL中的内容进行逻辑 “或 ”操作,结果存放于AH中,第 (3)空填写 “OR”。将高 8位和低 8位逻辑 “与 ”的结果 (DL的内容 )送AL,所以第 (4)空填写 “AL”。注意,此时 AH中的内容为高 8位和低 8位逻辑 “或 ”的结果。接着将地址指针 BX加 2,指向下一个 16位 二进制数。最后,将 AX中的逻辑 “或 ”和逻辑 “与 ”的结果存入到字单元 DI中,所以第 (5)空填写 “MOV DI, AX”。 当处理完一个 16位二进制数后, CX减 1,若 CX的内容不为 0,则转向 PRO段,继续处理下一个 16位二进制数:若 CX内容为 0,说明 1016位二进制数已全部处理完。显然第 (6)空应填写 “DECCX”,用以实现循环计数。