对内存单元中连续存放的20个ASCII字符进行转换,大写的“A—Z”转换成小写,小写的“a-z”转换成大写,其他字符变为00,结果存放在RESULT开始的内存单元中。部分程序已经在PROG1.ASM中给出,请编写BEGIN到END之间代码。 原有数据

admin2009-02-15  42

问题 对内存单元中连续存放的20个ASCII字符进行转换,大写的“A—Z”转换成小写,小写的“a-z”转换成大写,其他字符变为00,结果存放在RESULT开始的内存单元中。部分程序已经在PROG1.ASM中给出,请编写BEGIN到END之间代码。
   原有数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由SAVE保存到OUTPUT1.DAT文件。
   对程序必须进行汇编,并与10.OBJ连接产生PROG1.EXE执行文件,最终产生运行结果(无结果或结果不正确均不得分)。
   部分源程序如下:  
   EXTRN       LOAD:FAR,SAVE:FAR
   N           EQU       20
   STAC        SEGMENT  STACK
   DB          128DUP(?)
   STAC        ENDS
   DATA        SEGMENT
   SOURCE      DB       N  DUP(?)
   RESULT      DB       N  DUP(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
   MOV         ES,AX
   LEA          DX,SOURCE    ;数据区起始地址
   LEA          SI,NAMED     ;原始数据文件名
   MOV         CX,N          ;字节数
   CALL         LOAD           ;从"IArPUT1.DAT"中读取数据
****BEGIN****
*****END*****
     LEA        DX,RESULT    ;结果数据区首地址
     LEA        SI,NAME1     ;结果文件名
     MOV        CX,N         ;结果字节数   
     CALL       SAVE          ;保存结果到文件
      RET
     START      ENDP   
     CODE       ENDS
     END        START   
相关知识:
●定义符号伪指令
指令功能:给一个表达式分配一个符号名或给一个符号分配一个值。
指令格式:(i)符号EQU表达式(不允许符号重定义)
           (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  [定位方式]  [联系方式]  [’类别’)
使用段定义伪指令可以将程序和有关的数据信息定义在相应的段中。
●循环的实现
通过设置计数器初值,在完成一组操作后,修改计数器中的值,重新执行操作直到计
  数器中的值为0。
    例如:MOV CX,N
          LI:
          ┆
          LOOP L1(短标号地址)
    或:DEC  CX
        JNZ  11(短标号地址)
   注意:本书学习要点讲过的内容,本章节不予赘述。
   ●字符的ASCII码
    十六进制数“0”~“F”是连续的,它们的ASCII码不是连续的,但仍然有规律可循,“0”~“9”的ASCII码为30H~39H,“A”~“F”的ASCII码为41H~46H,“A”~“Z”的ASCII是从41H开始连续的,“a”~“z”的ASCII是从61H开始连续的。
   编程方法:
    第一步:分析程序要求的功能。
    本程序要求完成以下功能:
    (1)从数据文件INPUT1.DAT中读取20个8位无符号整数存放在SOURCE开始的内存单元中。
    (2)将SOURCE开始的20个ASCII码进行判断,处理,并将结果存放在RESULT开始的内存单元中。  
    (3)将处理结果存放在0UWUT1.DAT文件
     第二步:用相应的汇编程序来实现其功能。
    (1)数据的读取和存人文件部分的实现,题目中已经给出。
    (2)大小写判断转换处理,我们可根据英文大写字母“A~Z”和小写字母“a~z”的 ASCII码是连续的,并且同字母的大小写的ASCII码相差20H,可以直接在其ASCII码上加减20H进行大小写的转换。
    处理过程就是,从数组中取来一个元素,先判断它是否是大写,若为大写,则直接减 20H变为小写;否则判断它是否为小写,若为小写,直接减20H变为大写;若大小写均不是,就赋值为0。重复操作所有的元素。

选项

答案LEASI,SOURCE UCA DI,RESULT MOV CX,N LOOP1:MOV AL, [SI] CMP AL, ’A’ JB SAVE_0_TO_RESULT ;不是大小写;存0 CMP AL, ’Z’ JA LOWER ;不是大写,转到判断是否为小写 ADD AL, 20H ;大写,转换成小写保存 JMP SAVE_To_RESULT LOWER:CMP AL, ’a’ JB SAVE_0_To_RESULT ;不是大小写,存0 CMP AL, ’z’ JA SAVE_0_To_RESULT ;不是大小写,存0 SUB AL, 20H ;小写,转换成大写,保存 JMP SAVE To RESULT SAVE 0 TO RESULT: MOV AL, 0 SAVE TO RESULT: MOV [DI], AL INC SI INC DI LOOP lOOP1

解析
转载请注明原文地址:https://kaotiyun.com/show/qjrZ777K
0

最新回复(0)