|
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 MOV BX,0 NEXT: MOV AL,[SI] add bl,al ;__________________ adc bh,0 ;__________________ mov [di],al ;MOV [DI], ____ inc di inc si ;__________________ ;__________________ LOOP NEXT mov [di],bx ;MOV [DI], ____ ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+2 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 41 72 AB 35 39 CF 48 43 44 45 39 32 38 41 48 37 36 35 38 37 output1.dat 内容应当如下: 41 72 AB 35 39 CF 48 43 44 45 39 32 38 41 48 37 36 35 38 37 EC 05
上机题之47 以下内容为程序代码:
;* 请编制程序PROG1.ASM,其功能是:内存中连续存放着20个ASCII ;* 字符,如果是大写字母A至Z之间的字符,请把它们转换成相应的小 ;* 写字母的ASCII字符(否则不作转换)并统计原20个ASCII字符中字 ;* 符“A”的个数。 转换结果(包括不作转换的非A~Z之间的原ASCII ;* 字符)按序存入内存中,之后存放原20个ASCII字符中为字符“A” ;* 的个数(用一个字节表示)。 ;* 例如: ;* 内存中有30H('0'),31H('1'),61H('a'),41H('A'),42H('B'),… ;* 结果为 30H,31H,61H,61H,62H,…,后跟用一个字节表示的原20 ;* 个ASCII字符中字符“A”的个数 ;* 部分程序已给出,其中原始数据由过程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+1 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 **** MOV DI,OFFSET RESULT MOV BX,0 MOV DL,0 MOV CX,N PRO: MOV AL,SOURCE[BX] CMP AL,41H jb keep ;__ KEEP cmp al,'Z' ;CMP AL,___ JNBE KEEP CMP AL,42H jnb ninc ;JNB ____ ; >=42H INC DL NINC: add al,20h ;ADD AL,___ MOV [DI],AL INC DI JMP JUMP KEEP: MOV [DI],AL inc di ;_______________ JUMP: INC BX DEC CX JNZ PRO mov [di],dl ;_______________ ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+1 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 30 40 31 41 32 42 33 43 34 44 35 45 61 48 5B 5A 7A 7B 60 7F output1.dat 内容应当如下: 30 40 31 61 32 62 33 63 34 64 35 65 61 68 5B 7A 7A 7B 60 7F 01
上机题之48 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 对经常上下波动的数据采 ;* 用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次 ;* 值比较, 如数据变化方向改变 (原变大现变小或原变小现变大), ;* 说明已过峰值, 这时就将当前值记录下来。 ;* 例如(下列数据均为无符号数): ;* 原数据: 23H,45H,89H,67H,5CH,36H,3CH,78H,... ;* 压缩后: 23H,67H,3CH,... ;* 内存中从SOURCE开始连续存放着四十个八位无符号数, 假定相 ;* 邻两数无相等的情况, 编程按上述方法进行压缩, 结果保存在 ;* RESULT开始的内存单元中。 ;* 部分程序已在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 40
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] XOR AX,AX XOR BX,BX LODSB ; AL<-X[1] MOV BL,[SI-2] ; BL<-X[0] SUB BX,AX ; X[0]-X[1] MOV DX,BX ; 保存差值在DX中 MOV CX,N-2 FILTER: XOR AX,AX XOR BX,BX LODSB ; X[n] MOV BL,[SI-2] ; X[n-1] SUB BX,AX ; X[n-1]-X[n]
;____________________ ; 比较相邻两差值(BX,DX)符号位是否相同 cmp bh,dh ;____________________ je skip ;J__ SKIP ; 相同, 则数据改变方向未变 stosb ;____________________ ; 不同, 方向变化, 保存当前值 SKIP: mov dx,bx ;____________________ 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 内容如下: 38 4E 3C 37 2B 01 0C 3A 78 FA F1 BE 50 5D 68 4B 32 22 17 26 4C 67 C4 B4 96 36 2D 21 59 CF F5 ED CB C4 96 66 41 4E 59 9A output1.dat 内容应当如下: 38 3C 0C F1 5D 4B 26 B4 59 ED 4E 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
上机题之49 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着二十个 ;* 有符号字节数序列,求出该序列的最大值和最小值。 结果存放形 ;* 式为:先按原序存放二十个需处理的有符号字节数序列,后跟该序 ;* 列的最大值和最小值(最大值在前,最小值在后)。 ;* 例如: ;* 内存中有 81H,02H,03H, ... ;* 结果为 81H,02H,03H, ... (共二十个需处理的原有符号字 ;* 节序列),后跟该序列的最大值和最小值 (最大值在前,最小值在 ;* 后)。 ;* 部分程序已给出,其中原始数据由过程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'中读取数据 ; **** BEGIN **** ; 最大值放在BH中,最小值放在BL中 LEA SI,SOURCE lea di,result ;LEA ____,RESULT MOV BH,[SI] ; 第一个字节既为最大值 MOV BL,BH ; 又为最小值 MOV [DI],BH add si,1 add di,1 ;ADD SI, ____ ;____________________ MOV CX,N-1 NEXT: MOV AL,[SI] CMP AL,BH jl chkmin ;____ CHKMIN MOV BH,AL JMP ENDL CHKMIN: CMP AL,BL JGE ENDL mov bl,al ;MOV ____,AL ENDL: MOV [DI],AL ADD SI,1 ADD DI,1 LOOP NEXT mov [di],bh inc di ;____________________ ;____________________ mov [di],bl ;MOV [DI],____ ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,2+N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 12 34 23 45 75 98 00 87 FF AC D4 6E 8B A9 28 39 88 77 24 DE output1.dat 内容应当如下: 12 34 23 45 75 98 00 87 FF AC D4 6E 8B A9 28 39 88 77 24 DE 77 87
上机题之50 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着10个十六 ;* 位二进制数,每个数的序号依次定义为0,1,…9。统计每个数中位为 ;* 0的个数N0, N1,…, N9(均用一个字节表示),然后按序将N0至N9存 ;* 入内存中,最后再用一个字节表示这10个数中为0的位的总数n ;* (n= N0+ N1+…+N9)。 ;* 例如: ;* 内存中有 0000H,000FH,FFFFH,… ;* 结果为 10H,0CH,00H,…,最后为n ;* 部分程序已给出,其中原始数据由过程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 DW N DUP(?) RESULT DB N+1 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*2 ; 字节数 CALL LOAD ; 从 'INPUT1.DAT'中读取数据 ; **** BEGIN **** MOV DI,OFFSET RESULT MOV CL,N MOV BX,0 MOV DH,0 PRO: MOV DL,0 MOV AX,SOURCE[BX] mov ch,10h ;MOV CH,__ COUNT: rol ax,1 ;_________________ jc jump ;__ JUMP INC DL JUMP: DEC CH jnz count ;JNZ __________ MOV [DI],DL ADD DH,DL INC DI add bx,2 ;ADD _______ DEC CL JNZ PRO mov [di],dh ;MOV __________ ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+1 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 00 00 01 00 FF FF AA AA 55 55 55 AA 33 33 77 77 00 10 10 00 output1.dat 内容应当如下: 10 0F 00 08 08 08 08 04 0F 0F 61
|