请编制程序PROC1.ASM,其功能是:内存中有一个ASCII字符串(从S0URCE开始存放),试将其中所有连续的回车与换行符(0DH,0AH)置换成单个回车符(0DH)。字符串以00H结尾,长度(包括00H)不超过100个字节。例如:字符串41H,42H,0DH,0AH,43H,00H转换为41H,42H,0DH,43H,00H部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUT- PU

题目

请编制程序PROC1.ASM,其功能是:内存中有一个ASCII字符串(从S0URCE开始存放),试将其中所有连续的回车与换行符(0DH,0AH)置换成单个回车符(0DH)。字符串以00H结尾,长度(包括00H)不超过100个字节。

例如:字符串41H,42H,0DH,0AH,43H,00H

转换为41H,42H,0DH,43H,00H

部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUT- PUT1.DAT中。请编写BECIN到END之间的代码。对程序必须进行汇编,并与IO.OBJ连接产生PROC1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。

部分源程序如下:

EXTRN LOAD:FAR,SAVE:FAR

N EQU 100

STAC SEGMENT STACK

DB 128 DUP (?)

STAC ENDS

DATA SEGMENT

SOURCE DB N DUP (0)

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

LEA DX, SOURCE ; 数据区起始地址

LEA SI, NAME0 ; 原始数据文件名

MOV CX,N ; 字节数

CALL LOAD ; 从"INPUT1.DAT"中读取数据

**** BEGIN ****

***** END *****

LEA DX, RFSULT ; 结果数据区首址

LEA SI, NAME1 ; 结果文件名

MOV CX,N ; 结果字节数

CALL SAVE

RET

START ENDP

CODE ENDS

END START

编程思路:

第一步:分析程序要求的功能。

本程序需要完成以下功能。

(1)据文件INPUT1.DAT中读取100个ASCII码存放在SOURCE开始的内存单元中。

(2)将SOURCE开始的100个字单元中的ASCII码,将0DH后的0AH删除,并将结果存放在RFSULT开始的内存单元中。

(3)将结果存放在OUTPUT1.DAT中。

第二步:用相应的汇编程序来实现其功能。

(1) 数据的读取和存入文件部分的实现,题目中已经给出。

(2) 如果是将数据在原地进行处理,那么每删除一个数据就要将其后面的所有数据向前移动一个位置,如果直接将扫描处理完毕的数据复制到结果地址中,将会节省移动数据的开销;

因为要删除0DH后面的0AH,所以,在扫描数组的过程中除了要了解当前数据元素的内容还要了解前一个数据的内容。解决方法可使用标志单元记录前一个数据是否为 0DH,然后当前数据元素根据标志单元的内容决定当前元素是否复制到结果中;也可在扫描数组的过程中,如果碰到一个0DH,则进入不同的程序段,这个程序段决定是否将当前数据元素复制到结果中。我们的参考答案采用了后一种方法。


相似考题
更多“请编制程序PROC1.ASM,其功能是:内存中有一个ASCII字符串(从S0URCE开始存放),试将其中所有连续的 ”相关问题
  • 第1题:

    请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。

    例如:

    内存中有A704H(1010011100000100B),0000H,9A58H…

    结果为 29C1H(0010100111000001B),0000H,134BH…

    部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

    请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并白行编程来完成所要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

    试题程序:


    正确答案:(1)0 (2)TEST (3)NZ (4)SHR (5)LOOP NEXT
    (1)0 (2)TEST (3)NZ (4)SHR (5)LOOP NEXT 解析:此程序要求对内存中的20个十六位二进制数的每一个数逻辑右移,直到最低位为1为止。考查了SHR,TEST,LOOP等指令的用法。
    程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据区SOURCE、结果数据区RESULT;两个字节型变量:原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
    先将原始数据偏移地址装入到SI中,结果数据偏移地址装入到DI中,CX赋初值为N,用于控制循环处理的次数。
    NEXT段,将SI中内容送AX中,再将AX与0做比较,如果AL等于0,转向SKIP段。所以第(1)空填写"0"。
    LOOP1段的开始要填写第(2)空,这里是要判断AX的最低位是否为1,判断的方法是将AX和0001H做TEST指令。注意:这里千万不能用指令"ANDAX,0001H",否则会改变AX的初值.而TEST指令不改变AX的值,它的结果只显示在几个状态标志位上。所以第(2)空填写"TEST"。当TEST的结果ZF=0,说明AX的最低位为1,AL不需要再逻辑右移了,转向SKIP段;否则,ZF=1,说明AX的最低位为0,还需要将AX继续逻辑右移1位,无条件转向LOOP1段,AX再逻辑右移1位,再判断,若仍不满足最低位为1,继续右移1位,直到AX最低位变为1为止。所以第(3)、(4)空分别填写"NZ"和 "SHR"。
    再来看SKIP段,当AX的最低位为1,或者AX等于0000H时,直接将AX存入到DI中,SI和DI地址都加2,因为原始数据和结果数据都是字型的,它们在内存中都占两个地址。接着从NEXT处循环,处理下一个十六位二进制数。所以第(5)空填写"LOOP NEXT"。

  • 第2题:

    请编制程序,其功能为:将一个ASCII字符串中所有大写字母全部变成小写字母,其他字母不变。字符串以00H结束,长度不超过20个字节。

    部分程序已经给出,其中原始数据由LOAD过程从文件INPUT1.DAT中读入从SOURCE开始的内存单元,运算结果要求从RESULT开始存放,由SAVE过程保存到OUTPUT1.DAT文件中。请在BEGIN和END之间补充使其完整,完成要求的功能。或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终产生运行结果。

    部分程序如下:

    ;PROG1.ASM

    EXTRN LOAD:FAR, SAVE:FAR

    N EQU 20

    DSEG SEGMENT

    SOURCE DW N DUP (?)

    RESULT DW N DUP (0)

    NAME0 DB 'INPUT1.DAT',0

    NAME1 DB 'OUTPUT1.DAT',0

    DSEG ENDS

    SSEG SEGMENT STACK

    DB 256 DUP (?)

    SSEG ENDS

    CSEG SEGMENT

    ASSUME CS:CSEG, DS:DSEG;SS:SSEG

    START PROC FAR

    PUSH DS

    XOR AX,AX

    PUSH AX

    MOV AX,DSEG

    MOV DS,AX

    LEA DX, SOURCE

    LEA SI,NAME0

    MOV CX,N

    CALL LOAD

    ; *** BEGIN ***

    ……

    ……

    ……

    ; *** END ***

    LEA DX, RESULT

    LEA SI,NAME1

    MOV CX,N

    CALL SAVE

    RET

    START ENDP

    CSEG ENDS

    END START


    正确答案:; *** BEGIN *** LEA SISOURCE LEA DIRESULT MOV CXN LP0:MOV AL[SI] CMP AL00H JZ QUIT CMP AL'A' JB LP1 CMP AL'Z' JNB LP1 ADD AL20H. LP1: MOV [DI]AL INC DI INC SI LOOP LP0 QUIT: NOP ; *** END *** [INPUT1.DAT 中的输入数据]: 81H60H8EH38H68H60H8EH38H68H5EH 50H61H72H g3H94H2BH51H 11H45HE9H [输出结果] 81 60 8E 38 68 60 8E 38 68 5E 70 61 72 83 94 2B 71 11 65 E9
    ; *** BEGIN *** LEA SI,SOURCE LEA DI,RESULT MOV CX,N LP0:MOV AL,[SI] CMP AL,00H JZ QUIT CMP AL,'A' JB LP1 CMP AL,'Z' JNB LP1 ADD AL,20H. LP1: MOV [DI],AL INC DI INC SI LOOP LP0 QUIT: NOP ; *** END *** [INPUT1.DAT 中的输入数据]: 81H,60H,8EH,38H,68H,60H,8EH,38H,68H,5EH, 50H,61H,72H, g3H,94H,2BH,51H, 11H,45H,E9H [输出结果] 81 60 8E 38 68 60 8E 38 68 5E 70 61 72 83 94 2B 71 11 65 E9

  • 第3题:

    【单选题】birth = card[6:14]描述正确的是?

    A.从card字符串的序号6开始,到序号14结束,且不包含序号14。存放到birth中

    B.从card字符串的序号6开始,到序号13结束,且不包含序号13。存放到birth中

    C.从card字符串的序号6开始,到序号15结束,且不包含序号15。存放到birth中

    D.从card字符串的序号5开始,到序号13结束,且不包含序号13。存放到birth中


    Attachment bit由连接到其它区域的L1/L2路由器产生到其L1 LSP中;L1路由器收到Attachment bit位为1的多条L1 LSP后将选择距离最近的Level-1-2路由器作为下一跳产生一条缺省路由

  • 第4题:

    请编制程序,其功能是:以SOURCE开始的内存区域存放着若干字节的数据,以''作为数据的结束标志。将其中的空格滤除,对每个非空格数据的最高位清0后依次存放到RESULT指示的区域,其后存放一个空格符(20),然后存放原来的空格个数,最后仍以''结束。

    例如:

    内存中有45H,20H,87H,20H,A5H,32H,20H,20H,20H,23H

    结果为 45H,07H,25H,32H,20H,05H,23H

    部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

    请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

    试题程序:


    正确答案:(1)AGN11 (2)'#' (3)INCDI (4)JMP AGN1 (5)20H (6)[DI]
    (1)AGN11 (2)'#' (3)INCDI (4)JMP AGN1 (5)20H (6)[DI] 解析:此程序要实现以下功能:非空格数据最高位清0,以及统计空格符的个数。然后将处理后的数据存储到内存区域,并以"20H",空格符个数及'#'结尾。要读懂程序中的BL是存放空格符的个数。
    程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量,原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据 段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
    先将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。BL清0。接着将SI中内容送AL中。SI地址加1,准备取下一个字节。将AL与空格符比较,若相等,则转向AGN11段;否则,转向AGN2段。所以第(1)空填写"AGN11"。
    AGN11段中,BL是记录空格符的个数。当AL为空格符时,BL加1。接着转向AGN1,继续判断下一个字符。
    AGN2段的第(2)空中,将AL与'#'比较,若AL='#',则数据已经搜索到'#',搜索完毕,转向DONE段;否则,用指令"AND AL 7FH"将AL字符最高位清0,并将结果AL存入到DI中。DI地址加1,无条件转向AGN1段。所以第(3)空填写“INCDI”,第(4)空填写"JMPAGN1"。DONE这一段,是统计完所有字符后,将空格符存入到DI中。所以第(5)空填写"20H"。接着将空格符个数BL存入到DI中。最后将字符'#'存入到DI中。所以第(6)空填写[DI]。

  • 第5题:

    请编制程序,其功能是:内存中连续存放着20个ASCII字符,如果是小写字母a~z之间的字符,请把它们转换成相应的大写字符;若为其他字符,不作转换。

    例如:

    内存中有61H('a'),62H('b'),31H('1'),41H('A'),42H('B')…

    结果为 41H('A'),42H('B'),31H,41H('A'),42H('B')…

    部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

    请填空BEGIN和END之间已给出的源程序使其完整(空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

    试题程序:


    正确答案:(1)UPPER2 (2)'Z' (3)A (4)AL0DFH (5)AL (6)SI (7)DI (8)LOOP
    (1)UPPER2 (2)'Z' (3)A (4)AL,0DFH (5)AL (6)SI (7)DI (8)LOOP 解析:此程序要求实现的功能是:将内存中连续存放着的20个ASCII字符,如果是小写字母a~z之间的字符,把它们转换成相应的大写字符;若为其他字符,不作转换。
    程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
    先将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中,CX赋值为N,用于控制循环处理的次数。
    NEXT段,取第一个原始ASCII字符,即将SI中内容送AL,将AL与'a'做比较,若AL小于字符'a'的ASCII值,说明AL为大写字母或其他字符,则转向UPPER2处执行;否则,将AL与字符'z'再做比较,若AL大于字符'z'的ASCII值,说明AL为其他字符,仍转向UPPER2处执行;否则,AL大于等于字符'a'的ASCII值,小于等于字符'2'的ASCII值,说明AL为小写字母a~z之间的字符。因为小写字母的ASCII值范围是61H~7AH,大写字母的ASCII值范围是41H~5AH,所以要将小写字母变成大写字母的话,只需将小写字母的ASCII值和0DFH进行逻辑与操作。读者可以试一下,将61H~7AH之间的值和0DFH进行逻辑与操作,看是否能得到41H~5AH之间的值。从上面的分析来看,第(1)空填写"UPPER2",第(2)空填写"'2'",第(3)空填写"A",第(4)空填写"AL,0DFH"。
    UPPER2段,当字符AL不为小写字母,为大写字母或其他字符时,不需将它做任何变换,直接将该字符AL存入到DI中。所以第(5)空填写"AL"。接着,SI地址加1,准备取下一个字符,继续判断;
    DI地址加1,准备存储下一个转换后或不需转换的字符。然后从NEXT入口处循环,继续下一个字符的处理。一共循环CX即20次,才能完成程序的功能。所以第(6)空填写"SI",第(7)空填写"DI",第(8)空填写"LOOP"。