|
input1.dat 内容如下: 0102030405060708090A output1.dat 内容应当如下: 01 02 04 05 06 07 08 09 0A 00
本题重编程序思路也许更为简单,举例如下: 以下内容为程序代码:
; *** BEGIN *** CLD lea si,source lea di,result mov cx,N-1 mov al,x loop1: cmp al,[si] je loop2 movsb loop loop1 loop2: inc si REP MOVSB mov byte ptr [di],0h ; *** END ***
上机题之36 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着16个二 ;* 进制字节数,在原16个数的第4和第5个数之间插入00H,在原16个 ;* 数的第8和第9个数之间插入55H,在原16个数的第12和第13个数之 ;* 间插入AAH,在原16个数的最后加入FFH。将按上述方法插入4个字 ;* 节数后得到的20个字节数存入内存中。 ;* 例如: ;* 内存中有 10H,20H,30H,40H,50H,…,8FH(共16个字节) ;* 结果为 10H,20H,30H,40H,00H,50H,…,8FH,FFH(共20个字节) ;* 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT ;* 中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放, ;* 由过程SAVE保存到文件OUTPUT1.DAT中。 ;* 填空BEGIN和END之间已给出的源程序使其完整 (空白已用横线 ;* 标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦 ;* 可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功 ;* 能。 ;* 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文 ;* 件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调 ;* 试中若发现整个程序中存在错误之处,请加以修改。
EXTRN LOAD:FAR,SAVE:FAR N EQU 16 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) INDATA DB 0FFH,0AAH,55H,00H RESULT DB N+4 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 si,0 ;_______________ MOV DI,0 MOV CX,4 MOV BX,4 CHAN: mov ah,source[si] ;________________________ MOV RESULT[DI],AH inc si ;_____________ INC DI DEC CX JZ INSER1 JMP CHAN INSER1: PUSH SI MOV SI,BX MOV AH,INDATA[SI-1] mov result[di],ah ;MOV RESULT[DI],__ DEC BX jz exit ;JZ ____ MOV CX,04H pop si ;_______________ INC DI jmp chan ;JMP ____ EXIT: POP SI ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+4 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 12 34 44 31 E0 DD F0 2F 2C CD 61 8F 49 BC AC 2D output.dat 内容应当如下: 12 34 44 31 00 E0 DD F0 2F 55 2C CD 61 8F AA 49 BC AC 2D FF
上机题之37 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着二十个 ;* 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链接产生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 NEXT: MOV AL,[SI] CMP AL,'a' jb upper2 ;JB ____ cmp al,'z' ;CMP AL, ____ ja upper2 ;J___ UPPER2 and al,5fh ;AND ____ UPPER2: mov [di],al inc si inc di loop next ;MOV [DI], ____ ;INC ____ ;INC ____ ;____ NEXT ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 44 69 46 64 66 61 68 47 7F 47 4C 6E 4B 45 6C 48 64 69 87 5A output1.dat 内容应当如下: 44 49 46 44 46 41 48 47 7F 47 4C 4E 4B 45 4C 48 44 49 87 5A
上机题之38 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 对经常上下波动的数据可采 ;* 用只记录峰值的数据压缩方法。 即每次将采样到的当前值和前一次 ;* 值比较, 如数据变化方向改变 (原变大现变小或原变小现变大), 说 ;* 明已过峰值, 这时就将前一值(峰值)记录下来。 ;* 例如(下例数据均为无符号数): ;* 原数据: 23H,45H,89H,67H,5CH,36H,3CH,... ;* 压缩后: 23H,89H,36H,... ;* 内存中从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 MOV BL,[SI-2] SUB AX,BX ; X[1]-X[0] MOV DX,AX MOV CX,N-2 FILTER: XOR AX,AX XOR BX,BX LODSB ; X[n] MOV BL,[SI-2] ; X[n-1] SUB AX,BX ; X[n]-X[n-1] xchg ax,bx ;___________________ ; 相邻两差值(AX,DX)符号位是否相同 cmp bh,dh ;___________________ je skip ;J__ SKIP ; 相同, 数据方向未变 mov dx,bx ;___________________ ; 不同, 方向变化, 保存峰值 STOSB SKIP: ;___________________ 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 4E 01 FA 50 68 17 C4 21 F5 41 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
上机题之39 以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着二十个无 ;* 符号8位二进制数,每个数为摇号机一次摇出的两个号码的压缩BCD码 ;* 表示。现统计此二十次摇号中号码0,1,2,…,9出现的次数,将结果存 ;* 入内存。 ;* 例如: ;* 内存中有 00H,02H,32H,45H,08H,19H,67H,51H,90H,85H, ;* 62H,44H,73H,57H,39H,81H,36H,92H,21H,05H ;* 结果为 06H,04H,05H,04H,03H,05H,03H,03H,03H,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/2) 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 SI,SOURCE MOV CX,20 MOV BX,0 AGN0: MOV AH,[SI] mov al,ah ;__________________ AND AL,0FH and ah,0f0h ;__________________ PUSH CX MOV CX,4 AGN1: shr ah,1 ;___ AH,1 LOOP AGN1 POP CX MOV BL,AH inc result[bx] ;_________________ MOV BL,AL inc result[bx] ;_________________ INC SI NEXT: LOOP AGN0 ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N/2 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 00 12 34 56 78 90 99 23 45 66 32 74 18 76 63 24 55 81 27 15 output1.dat 内容应当如下: 03 04 05 04 04 05 05 04 03 03
上机题之40 以下内容为程序代码:
;* 请编制程序PROG1.ASM,其功能是:内存中连续存放着两个有 ;* 符号字节数序列Ak和Bk(k=0,…,9),求序列Ck,Ck=Ak+Bk(Ck以有 ;* 符号字的形式按C0,…,C9 的顺序连续存放)。 ;* 例如: ;* 序列Ak为80H(-128D),31H(+49D),61H(+97D),7FH(+127D),…; ;* 序列Bk为80H(-128D),01H(+1D),F1H(-15D),7FH(+127D),…。 ;* 结果Ck为FF00H(-256D),0032H(+50D),0052H(+82D), ;* 00FEH(+254D), …。 ;* 部分程序已给出, 其中原始数据由过程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*2 DUP(?) ; 顺序存放A0,…,A9,B0,…,B9 RESULT DW N DUP(0) ; 顺序存放C0,…,C9 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 ; 结果从RESULT开始存放 MOV BX,0 MOV CX,N ; PRO: MOV AH,0 mov al,source[bx+N] ;MOV AL,_____________ ; 序列Bk中的一个字节 MOV DL,AL ; 暂存Bk add al,source[bx] ;____ AL,SOURCE[BX] ; Ck=Bk+Ak JNO STAY ; 无溢出转STAY JUMP1: MOV AH,00 ; 有溢出 ADD DL,0 JNS JUMP ; Bk是正数(为一个正数加上一个正数, ; 结果为负数的溢出情况)转JUMP(AH ; 已为00H) mov ah,0ffh ;MOV AH,________ ; Bk是负数(为一个负数加上一个负数, ; 结果为正数的溢出情况)将结果变为有符 ; 号字的形式(为负) jmp jump ;JMP ____ STAY: cbw ;_____ ; AL中数的符号扩展到AH,无符号字节 ; 变成无符号字,有符号字节变成有符号字 JUMP: MOV [DI],AX ADD DI,2 INC BX DEC CX JNZ PRO ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N*2 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
input1.dat 内容如下: 80 C0 81 00 7F 40 3F 80 C0 81 80 C0 81 00 7F 40 3F 7F 7F 64 output1.dat 内容应当如下: 00 FF 80 FF 02 FF 00 00 FE 00 80 00 7E 00 FF FF 3F 00 E5 FF
|