请编制程序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,则进入不同的程序段,这个程序段决定是否将当前数据元素复制到结果中。我们的参考答案采用了后一种方法。
第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链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
试题程序:
第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
第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中
第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链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
试题程序:
第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链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
试题程序: