上机题之16
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 对一个由可打印ASCII字符
;* (ASCII码20H~7FH)组成的字符串可采用下列方法进行压缩:从串首
;* 开始向后扫描,如某字符单独出现则该字符不变,如某字符连续出现
;* n次, 则该字符用ESC(1BH),n,<原字符>三个字节来代替(假定n不超
;* 过255)。
;* 设内存中从SOURCE开始有一用上述方法压缩的字符串, 其以
;* 00H结束, 解压后长度不超过100。试编程对其解压缩, 结果存入
;* RESULT开始的内存单元。
;* 例如:
;* 原串 :41H,1BH,06H,43H,61H,00H
;* 解压后:41H,43H,43H,43H,43H,43H,43H,61H,00H ("ACCCCCCa")
;* 部分程序已在PROG1.ASM中给出, 请填空BEGIN和END之间已给
;* 出的源程序使其完整(空白已用横线标出, 每行空白一般只需一条
;* 指令, 但功能相当的多条指令亦可)或删除BEGIN和END之间原有的
;* 代码并自行编写程序片段来完成要求的功能。
;* 原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内
;* 存单元中, 结果要求从RESULT开始存放, 由过程SAVE保存到文件
;* OUTPUT1.DAT中。
;* 对程序必须进行汇编, 并与IO.OBJ链接产生PROG1.EXE 执行文
;* 件, 最终运行程序产生结果(无结果或结果不正确者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 100
ESC_CODE EQU 27
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
MOV ES,AX ; 置附加段寄存器
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从 "input1.dat"中读取数据
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
CLD
L0: LODSB
CMP AL,0
JE QUIT
CMP AL,ESC_CODE
je expand
;J__ EXPAND
stosb
;___________________
JMP L0
EXPAND: lodsb
;___________________ ; 解压
XOR CX, CX
mov cl, al
lodsb
rep stosb
;___________________
;___________________
;___________________
;___________________
JMP L0
QUIT:
STOSB ; STORE THE '00H'
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名起始地址
MOV CX,N ; 字节数
CALL SAVE ; 保存结果到"output1.dat"文件中
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
41 1B 03 42 65 1B 19 42 43 1B 03 44 45 1B 23 48
49 4A 4C 1B 0C 47 1B 0E 4D 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00
output1.dat 内容应当如下:
41 42 42 42 65 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44
44 44 45 48 48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 49 4A 4C 47 47 47 47 47 47 47
47 47 47 47 47 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D
4D 4D 4D 00
上机题之17
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是:内存中连续存放着十个无符
;* 号8位格雷码表示的数, 现将此十个数转换成十个8位二进制数, 结
;* 果存入内存。其转换方法为二进制数的最高位d[7]与格雷码的最高位
;* g[7]相同, 二进制数的其余七位d[k](k=6,…,0) 分别为格雷码的位g[k]
;* (k=6,…,0)与二进制数的位d[k+1](k=6,…,0) 异或的结果。
;* 例如:
;* 内存中有 00H,03H,2BH,67H,0CH,15H,54H,02H,D8H,C7H
;* 结果为 00H,02H,32H,45H,08H,19H,67H,03H,90H,85H
;* 部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT
;* 中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,
;* 由过程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标
;* 出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),
;* 或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
;* 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,
;* 最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中
;* 若发现整个程序中存在错误之处, 请加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
STAC SEGMENT STACK
DB 128 DUP (?)
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
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从 'INPUT1.DAT'中读取数据
; **** BEGIN ****
LEA DI,RESULT
LEA SI,SOURCE
MOV CX,10
AGN0: MOV AL,[SI]
push cx
;_______________
MOV CX,8
MOV BX,0
AGN1: MOV AH,0
SHL BL,1
shl al,1
;___ AL,1
RCL AH,1
cmp ah,bh
jne set_one
;CMP AH,__
;________________
JMP NEXT
SET_ONE: OR BL,01H
NEXT: mov bh,bl
and bh,01h
;MOV __,BL
;________________
LOOP AGN1
pop cx
;________________
MOV [DI],BL
INC SI
INC DI
LOOP AGN0
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
A0 88 56 3D 02 D3 90 78 23 E8
output1.dat 内容应当如下:
C0 F0 64 29 03 9D E0 50 3D B0
上机题之18
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着二十个
;* 无符号字节数序列,请将它们排成升序(从小到大)。
;* 例如:
;* 内存中有 01H,04H,02H, ...(假设后十七个字节均大与04H)
;* 结果为 01H,02H,04H, ...(后跟十七个字节,按从小到大
;* 的顺序排列)
;* 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT
;* 中读入SOURCE开始的内存单元中。 运算结果要求从RESULT开始存
;* 放,由过程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之间
;* 已给出的源程序使其完整(空白已用横线标出,每行空白一般只需
;* 一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END
;* 之间原有的代码并自行编程来完成要求的功能。
;* 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文
;* 件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。
;* 调试中若发现整个程序中存在错误之处,请加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
STAC SEGMENT STACK
DB 128 DUP (?)
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
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从 'INPUT.DAT'中读取数据
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
NEXT0: MOV AL,[SI]
MOV [DI],AL
INC SI
inc di
loop next0
;_________________
;LOOP ____
CLD
mov bx,N-1
;MOV BX,______
NEXT1: LEA SI,RESULT
MOV CX,BX
NEXT2: lodsb
;LOD____
CMP [SI],AL
jae next3
;JAE ____________
xchg [si],al
;XCHG [SI],_______
MOV [SI-1],AL
NEXT3: loop next2
;LOOP _____
dec bx
jnz next1
;DEC ______
;JNZ ______
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
F1 A9 12 09 44 C5 10 35 E9 30 48 10 8A 30 7F 00 60 70 80 90
output1.dat 内容应当如下:
00 09 10 10 12 30 30 35 44 48 60 70 7F 80 8A 90
A9 C5 E9 F1
上机题之19
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放的二十个八
;* 位无符号数是由一个八位A/D转换器采集的信号(X[n], n=0~19),现
;* 要求对该信号按下列要求作剔点滤波处理(处理后的信号记为Y[n],
;* n=0~19):
;* 对于第一个信号(n=0)不作滤波, Y[0]=X[0]
;* 对于其后的信号(n>0)
;* a). Y[n]= Y[n-1]+delta if X[n]>Y[n-1]+delta
;* b). Y[n]= Y[n-1]-delta if X[n]<Y[n-1]-delta
;* c). Y[n]= X[n] if│X[n]-Y[n-1]│<=delta
;* 其中delta 取30(1EH)
;* 例如:
;* Xn: 78H,4AH,41H,63H,70H,...
;* Yn: 78H,5AH,41H,5FH,70H,...
;* 部分程序已在PROG1.ASM中给出, 请填空BEGIN和END之间已给
;* 出的源程序使其完整(空白已用横线标出, 每行空白一般只需一条
;* 指令, 但功能相当的多条指令亦可)或删除BEGIN和END之间原有的
;* 代码并自行编写程序片段来完成要求的功能。
;* 原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内
;* 存单元中, 结果要求从RESULT开始存放, 由过程SAVE保存到文件
;* OUTPUT1.DAT中。
;* 对程序必须进行汇编, 并与IO.OBJ链接产生PROG1.EXE 执行文
;* 件, 最终运行程序产生结果(无结果或结果不正确者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
DELTA EQU 30
STAC SEGMENT STACK
DB 128 DUP (?)
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,NAME0 ; 原始数据文件名起始地址
MOV CX,N ; 字节数
CALL LOAD ; 从"input1.dat"中读取数据
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
CLD
MOVSB ; Y[0]=X[0]
MOV CX,N-1
FILTER:
XOR AX,AX
XOR BX,BX
XOR DX,DX
LODSB ; X[n]
mov bl,[di-1]
;MOV BL,______ ; Y[n-1]->BL
MOV DL,BL
ADD BX,DELTA ; Y[n-1]+delta, 符号位扩展
SUB DX,DELTA ; Y[n-1]-delta, 符号位扩展
CMP AX,BX
jle next
;J__ NEXT
mov [di], bl
;____________________
JMP CONT
NEXT: CMP AX,DX
jge store
;J__ STORE
mov [di],dl
;____________________
JMP CONT
STORE: mov [di],al
;____________________
CONT: INC DI
LOOP FILTER
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名起始地址
MOV CX,N ; 字节数
CALL SAVE ; 保存结果到"output1.dat"文件中
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
36 15 00 0E 33 43 65 7B 96 B8 CF DF FE FF E6 D9 BE 99 90 B4
output1.dat 内容应当如下:
36 18 00 0E 2C 43 61 7B 96 B4 CF DF FD FF E6 D9
BE A0 90 AE
上机题之20
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 将十个无符号字节数据中高
;* 4位和低4位所表示的十六进制数分别转换为ASCII码, 并按照先低位
;* 后高位的顺序存放在指定的内存区中。
;* 例如:
;* 内存中有 61H,4AH,5BH,.....
;* 结果为 31H,36H,41H,34H,42H,35H,.....
;* 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT
;* 中读入SOURCE开始的内存单元中, 转换结果要求从RESULT开始存放,
;* 由过程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之间已经给出的一段源程序使其完整,填空处已
;* 经用横线标出, 每个空白一般只需要填一条指令或指令的一部分(指
;* 令助记符或操作数), 考生也可以填入功能相当的多条指令, 或删去
;* BEGIN和END之间原有的代码并自行编程来完成要求的功能。
;* 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,
;* 最终运行程序产生结果(无结果或结果不正确者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
DSEG SEGMENT
SOURCE DB N DUP(?)
RESULT DB 2*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,SS:SSEG,DS:DSEG
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
LEA DX,SOURCE
LEA SI,NAME0
MOV CX,N
CALL LOAD
; *** BEGIN ***
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
CLD
NEXT: LODSB
MOV BL,AL
and al,0fh
;AND AL,___
CALL SR
MOV AL,BL
PUSH CX
MOV CL,4
shr al,cl
pop cx
;SHR AL,__
;_____________
CALL SR
LOOP NEXT
JMP EXIT
SR PROC
CMP AL,0AH
JB NUM
ADD AL,07H
NUM: add al,30h
;ADD AL,___
STOSB
RET
sr endp
;SR ____
; *** END ***
EXIT: LEA DX,RESULT
LEA SI,NAME1
MOV CX,2*N
CALL SAVE
RET
START ENDP
CSEG ENDS
END START
input1.dat 内容如下:
124A583B464789231C26
output1.dat 内容应当如下:
32 31 41 34 38 35 42 33 36 34 37 34 39 38 33 32
43 31 36 32