1、三级 PC 技术机试-134 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.对内存单元中连续存放的 20 个 ASCII 字符进行转换,大写的“AZ”转换成小写,小写的“a-z”转换成大写,其他字符变为 00,结果存放在 RESULT 开始的内存单元中。部分程序已经在 PROG1ASM 中给出,请编写 BEGIN 到 END 之间代码。原有数据由过程 LOAD 从文件 INPUT1DAT 中读入 SOURCE 开始的内存单元中,结果要求从 RESULT 开始存放,由 SAVE 保存到 OUTPUT1DAT 文件。对程序必须进行汇编,并与
2、10OBJ 连接产生 PROG1EXE 执行文件,最终产生运行结果(无结果或结果不正确均不得分)。部分源程序如下: EXTRN LOAD:FAR,SAVE:FARN EQU 20STAC SEGMENT STACKDB 128DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?)RESULT DB N DUP(0)NAME0 DB INPUT1DAT, 0NAME1 DB OUTPUT1DAT, 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACSTART PROC FARPUSH DS XOR AX,A
3、XPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA DX,SOURCE ;数据区起始地址LEA SI,NAMED ;原始数据文件名MOV CX,N ;字节数CALL LOAD ;从“INPUT1DAT“中读取数据*BEGIN*END*LEA DX,RESULT ;结果数据区首地址LEA SI,NAME1 ;结果文件名MOV CX,N ;结果字节数 CALL SAVE ;保存结果到文件RETSTART ENDP CODE ENDSEND START 相关知识:定义符号伪指令指令功能:给一个表达式分配一个符号名或给一个符号分配一个值。指令格式:(i)符号 EQU 表达
4、式(不允许符号重定义)(ii)符号=表达式(允许符号重定义) 数据定义伪指令 指令格式:(i)名字DB 操作数 1,操作数 2,(为每个操作数分配 1 个字节的空间)(ii)名字DW 操作数 1,操作数 2,(为每个操作数分配 2 个字节的空间)(iii)名字DD 操作数 1,操作数 2,(为每个操作数分配 4 个字节的空间)(iv)名字DQ 操作数 1,操作数 2,(为每个操作数分配 8 个字节的空间)(v)名字DT 操作数 1,操作数 2,(为每个操作数分配 10 个字节的空间) 段定义伪指令 指令格式:段名 SEGMENT 定位方式 联系方式 类别)使用段定义伪指令可以将程序和有关的数据
5、信息定义在相应的段中。循环的实现通过设置计数器初值,在完成一组操作后,修改计数器中的值,重新执行操作直到计数器中的值为 0。例如:MOV CX,NLI:LOOP L1(短标号地址)或:DEC CXJNZ L1(短标号地址)注意:本书学习要点讲过的内容,本章节不予赘述。字符的 ASCII 码十六进制数“0”“F”是连续的,它们的 ASCII 码不是连续的,但仍然有规律可循,“0”“9”的ASCII 码为 30H39H,“A”“F”的 ASCII 码为 41H46H,“A”“Z”的 ASCII 是从 41H 开始连续的,“a”“z”的 ASCII 是从 61H 开始连续的。编程方法:第一步:分析程
6、序要求的功能。本程序要求完成以下功能:(1)从数据文件 INPUT1DAT 中读取 20 个 8 位无符号整数存放在 SOURCE 开始的内存单元中。(2)将 SOURCE 开始的 20 个 ASCII 码进行判断,处理,并将结果存放在 RESULT 开始的内存单元中。 (3)将处理结果存放在 0UWUT1DAT 文件第二步:用相应的汇编程序来实现其功能。(1)数据的读取和存入文件部分的实现,题目中已经给出。(2)大小写判断转换处理,我们可根据英文大写字母“AZ”和小写字母“az”的 ASCII 码是连续的,并且同字母的大小写的 ASCII 码相差 20H,可以直接在其 ASCII 码上加减
7、20H 进行大小写的转换。处理过程就是,从数组中取来一个元素,先判断它是否是大写,若为大写,则直接减 20H 变为小写;否则判断它是否为小写,若为小写,直接减 20H 变为大写;若大小写均不是,就赋值为 0。重复操作所有的元素。(分数:100.00)_三级 PC 技术机试-134 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.对内存单元中连续存放的 20 个 ASCII 字符进行转换,大写的“AZ”转换成小写,小写的“a-z”转换成大写,其他字符变为 00,结果存放在 RESULT 开始的内存单元中。部分程序已经在 PROG1ASM 中给出
8、,请编写 BEGIN 到 END 之间代码。原有数据由过程 LOAD 从文件 INPUT1DAT 中读入 SOURCE 开始的内存单元中,结果要求从 RESULT 开始存放,由 SAVE 保存到 OUTPUT1DAT 文件。对程序必须进行汇编,并与 10OBJ 连接产生 PROG1EXE 执行文件,最终产生运行结果(无结果或结果不正确均不得分)。部分源程序如下: EXTRN LOAD:FAR,SAVE:FARN EQU 20STAC SEGMENT STACKDB 128DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?)RESULT DB N DUP(0
9、)NAME0 DB INPUT1DAT, 0NAME1 DB OUTPUT1DAT, 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACSTART PROC FARPUSH DS XOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA DX,SOURCE ;数据区起始地址LEA SI,NAMED ;原始数据文件名MOV CX,N ;字节数CALL LOAD ;从“INPUT1DAT“中读取数据*BEGIN*END*LEA DX,RESULT ;结果数据区首地址LEA SI,NAME1 ;结果文件名M
10、OV CX,N ;结果字节数 CALL SAVE ;保存结果到文件RETSTART ENDP CODE ENDSEND START 相关知识:定义符号伪指令指令功能:给一个表达式分配一个符号名或给一个符号分配一个值。指令格式:(i)符号 EQU 表达式(不允许符号重定义)(ii)符号=表达式(允许符号重定义) 数据定义伪指令 指令格式:(i)名字DB 操作数 1,操作数 2,(为每个操作数分配 1 个字节的空间)(ii)名字DW 操作数 1,操作数 2,(为每个操作数分配 2 个字节的空间)(iii)名字DD 操作数 1,操作数 2,(为每个操作数分配 4 个字节的空间)(iv)名字DQ 操作
11、数 1,操作数 2,(为每个操作数分配 8 个字节的空间)(v)名字DT 操作数 1,操作数 2,(为每个操作数分配 10 个字节的空间) 段定义伪指令 指令格式:段名 SEGMENT 定位方式 联系方式 类别)使用段定义伪指令可以将程序和有关的数据信息定义在相应的段中。循环的实现通过设置计数器初值,在完成一组操作后,修改计数器中的值,重新执行操作直到计数器中的值为 0。例如:MOV CX,NLI:LOOP L1(短标号地址)或:DEC CXJNZ L1(短标号地址)注意:本书学习要点讲过的内容,本章节不予赘述。字符的 ASCII 码十六进制数“0”“F”是连续的,它们的 ASCII 码不是连
12、续的,但仍然有规律可循,“0”“9”的ASCII 码为 30H39H,“A”“F”的 ASCII 码为 41H46H,“A”“Z”的 ASCII 是从 41H 开始连续的,“a”“z”的 ASCII 是从 61H 开始连续的。编程方法:第一步:分析程序要求的功能。本程序要求完成以下功能:(1)从数据文件 INPUT1DAT 中读取 20 个 8 位无符号整数存放在 SOURCE 开始的内存单元中。(2)将 SOURCE 开始的 20 个 ASCII 码进行判断,处理,并将结果存放在 RESULT 开始的内存单元中。 (3)将处理结果存放在 0UWUT1DAT 文件第二步:用相应的汇编程序来实现
13、其功能。(1)数据的读取和存入文件部分的实现,题目中已经给出。(2)大小写判断转换处理,我们可根据英文大写字母“AZ”和小写字母“az”的 ASCII 码是连续的,并且同字母的大小写的 ASCII 码相差 20H,可以直接在其 ASCII 码上加减 20H 进行大小写的转换。处理过程就是,从数组中取来一个元素,先判断它是否是大写,若为大写,则直接减 20H 变为小写;否则判断它是否为小写,若为小写,直接减 20H 变为大写;若大小写均不是,就赋值为 0。重复操作所有的元素。(分数:100.00)_正确答案:(LEA SI,SOURCELEA DI,RESULT MOV CX,NLOOP1:MO
14、V AL, SICMP AL, AJB SAVE_0_TO_RESULT ;不是大小写;存 0CMP AL, Z JA LOWER ;不是大写,转到判断是否为小写ADD AL, 20H ;大写,转换成小写保存JMP SAVE_To_RESULTLOWER:CMP AL, aJB SAVE_0_To_RESULT ;不是大小写,存 0CMP AL, zJA SAVE_0_To_RESULT ;不是大小写,存 0SUB AL, 20H ;小写,转换成大写,保存JMP SAVE_To_RESULTSAVE_0_TO_RESULT:MOV AL, 0SAVE_TO_RESULT:MOV DI, ALINC SIINC DILOOP LOOP1)解析: