上机题六
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着十六个
;* 12位无符号二进制数DB[11]DB[10]…DB[0],其存放格式均为
;* DB[11] DB[10] DB[9] DB[8] DB[7] DB[6] DB[5] DB[4]
;* │←─────── 低地址字节───────→│
;* DB[3] DB[2] DB[1] DB[0] 0 0 0 0
;* │←──── 高地址字节 ────→│
;* 请判别这十六个12位二进制数是否大于800H;若大于800H,则
;* 相应地在内存中存入01H;否则,存入00H。最后存放这十六个12位
;* 二进制数中大于800H的数的个数n(n用一个字节表示)。
;* 例如:
;* 内存中有 12H,30H,84H,50H,80H,00H,……
;* 结果为 00H,01H,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 16
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N*2 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 CH,N
MOV CL,00H ; 大于800H的数的个数n
MOV BX,0
MOV DX,0100H
mov di,offset result
;MOV DI,_____________
PRO: MOV AH,[BX]
MOV AL,[BX+1]
cmp ax,8000h
jbe c_0
;CMP AX,_________
;JBE ___ ; <=800H
MOV [DI],DH ; >800H
INC CL
INC DI
JMP JUMP
C_0: MOV [DI],DL
INC DI
JUMP: ADD BX,2
DEC CH
JNZ PRO
mov [di],cl
;MOV [DI],__
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N+1 ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
FF F0 FF 00 F0 F0 0F F0 F0 00 0F 00 00 F0 00 00 00 50 05 00 50 00 0A A0 A0 A0 AA 00 AA A0 55 50
output1.dat 内容应当如下:
01 01 01 00 01 00 00 00 00 00 00 00 01 01 01 00
07
PC上机题之七
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放的二十个八
;* 位无符号数是一个自动抄表仪抄录的二十个用户某月的用水量(立方
;* 米),为了控制用水量,水费计算公式如下(X表示用水量; Y表示水费,
;* 单位为分):
;* a). Y= X*70 X<=5
;* b). Y= X*100 5<X<=20
;* c). Y= X*150 X>20
;* 例如:
;* 用水量(X): 04H, 10H, 18H,...
;* 水费( Y ): 0118H,0640H,0E10H,...
;* 试计算出这二十个用户应缴纳的水费, 结果用字(word)表示。
;* 部分程序已在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
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?)
RESULT DW 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 SI,SOURCE
LEA DI,RESULT
CLD
MOV CX,N
MOV BL,70
MOV BH,100
MOV DL,150
NEXT: mov al,[si]
;_________________
CMP AL,5
ja gt5
mul bl
;J__ GT5
;_________________
JMP STORE
GT5: CMP AL,20
ja gt20
mul bh
;J__ GT20
;_________________
JMP STORE
GT20: mul dl
;_________________
STORE: MOV [DI],AX
inc si
add di,2
;_________________
;_________________
LOOP NEXT
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名起始地址
MOV CX,N*2 ; 字节数
CALL SAVE ; 保存结果到"output1.dat"文件中
RET
START ENDP
CODE ENDS
END START
input1.dat 文件内容如下:
05 03 0A 22 0C 03 04 05 19 0C 0B 04 03 11 10 01 15 83 0F 0A
output1.dat 内容应当如下:
5E 01 D2 00 E8 03 EC 13 B0 04 D2 00 18 01 5E 01
A6 0E B0 04 4C 04 18 01 D2 00 A4 06 40 06 46 00
4E 0C C2 4C DC 05 E8 03
上机题之八
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着两个无符
;* 号字节数序列Ak和Bk(k=0,…,9), 求序列Ck,Ck为Ak和Bk异或运算
;* 的结果。 以字节的形式按C0,…,C9的顺序存放逻辑运算的结果。
;* 例如:
;* 序列Ak为00H,03H,07H,…;
;* 序列Bk为FFH,AAH,55H,…。
;* 结果Ck为FFH,A9H,52H,…。
;* 部分程序已给出,其中原始数据由过程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(?)
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*2 ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
; **** BEGIN ****
mov si,offset source
mov di,offset result
;MOV _____________
;MOV __________
MOV BX,0
PRO: mov al,[bx+N]
;MOV AL,___________
XOR AL,[BX]
mov [di],al
;MOV ____________
INC DI
inc bx
;________________
DEC CX
JNZ PRO
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
00 03 07 0F 10 31 55 AA FF 80 FF AA 55 70 3F 58 55 83 08 00
output1.dat 内容应当如下:
FF A9 52 7F 2F 69 00 29 F7 80
上机题之九
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中连续存放着二十个
;* ASCII字符,如果是大写字母A~Z之间的字符, 请把它们转换成相
;* 应的小写字符;若为其他字符,不作转换。
;* 例如:内存中有
;* 31H('1'),32H('2'),61H('a'),41H('A'),42H('B'), ...
;* 结果为 31H,32H,61H,61H(a),62H(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 lower2
;JB ____
cmp al,'Z'
;CMP AL, ____
ja lower2
;J___ LOWER2
add al,20h
;_________________
LOWER2: mov [di],al
;MOV [DI], ____
inc si
;____________________
inc di
;INC ____
loop next
;____ NEXT
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
62 64 63 45 75 68 40 37 DF 67 AC 6E 8B 65 6C 98 34 59 87 3D
output1.dat 内容应当如下:
62 64 63 65 75 68 40 37 DF 67 AC 6E 8B 65 6C 98
34 79 87 3D
PC上机题之10
以下内容为程序代码:
;* 请编制程序PROG1.ASM, 其功能是: 内存中存放着20个数字0~9
;* 之间的ASCII字符(包括数字0和9的ASCII字符)或SP字符(20H),请将
;* 数字0~9之间的ASCII字符 (包括数字0和9的ASCII字符)转换为相应
;* 的八位二进制数, 并将SP字符转换为$字符(24H)。将按上述方法处
;* 理后得到的20个字节存入内存中。
;* 例如:
;* 内存中有 20H('SP'),30H('0'),31H('1'),31H('1'),
;* 31H('1'),20H('SP'),32H('2'),…,39H('9')(共20个ASCII字符)
;* 结果为 24H('$'),00H,01H,01H,01H,24H('$'),02H('2'),
;* …,09H('9') (共20个字节)
;* 部分程序已给出,其中原始数据由过程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 ; 从 'INPUT1.DAT'中读取数据
; **** BEGIN ****
lea si,source
;_______________
MOV DI,0
mov cx,N
;_______________
CHAN: mov al,[si]
;_________________
SUB AL,20H
JZ CHANGE
sub al,10h
;SUB AL,___
MOV RESULT[DI],AL
inc di
inc si
;_____________
;_____________
DEC CX
JZ EXIT
JMP CHAN
CHANGE: MOV RESULT[DI],24H
INC DI
INC SI
DEC CX
JZ EXIT
jmp chan
;JMP ____
EXIT: NOP
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 内容如下:
20 20 30 31 32 20 33 34 35 36 20 20 37 38 39 20 33 32 31 20
output1.dat 内容应当如下:
24 24 00 01 02 24 03 04 05 06 24 24 07 08 09 24
03 02 01 24