上機(jī)題之21
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM,其功能是:內(nèi)存中連續(xù)存放著十個無符
;* 號8位二進(jìn)制數(shù),現(xiàn)將此十個數(shù)轉(zhuǎn)換成十個8位格雷碼表示的數(shù),結(jié)果
;* 存入內(nèi)存。其轉(zhuǎn)換方法為格雷碼的最高位g[7]與二進(jìn)制數(shù)的最高位d[7]
;* 相同, 格雷碼的其余七位g[k] (k=6,…,0) 分別為二進(jìn)制數(shù)的位d[k+1]
;* (k=6,…,0)與位d[k] (k=6,…,0) 異或的結(jié)果。
;* 例如:
;* 內(nèi)存中有 00H,02H,32H,45H,08H,19H,67H,03H,90H,85H
;* 結(jié)果為 00H,03H,2BH,67H,0CH,15H,54H,02H,D8H,C7H
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整(空白已用橫線標(biāo)
;* 出,每行空白一般只需一條指令, 但采用功能相當(dāng)?shù)亩鄺l指令亦可),
;* 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進(jìn)行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文件,
;* 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)試中
;* 若發(fā)現(xiàn)整個程序中存在錯誤之處, 請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?) ; 順序存放十個字節(jié)數(shù)
RESULT DB N DUP(0) ; 存放結(jié)果
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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從 ''INPUT1.DAT''中讀取數(shù)據(jù)
; **** 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
;___ BL,1
ROL AL,1 ; 老王注: 此處其實用 rcl 較好, 用 rol 有迷惑考生之意
rcl ah,1 ; 老王注: 此處不可用 rol
;_______________
CMP AH,BH
jne set_one
;___ SET_ONE
JMP NEXT
SET_ONE: OR BL,01H
NEXT: mov bh,ah
;MOV __,AH
LOOP AGN1
pop cx
;_______________
MOV [DI],BL
INC SI
INC DI
LOOP AGN0
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
A0 88 56 3D 02 D3 90 78 23 E8
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
F0 CC 7D 23 03 BA D8 44 32 9C
上機(jī)題之22
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中從SOURCE開始連續(xù)
;* 存放著二十一個八位有符號數(shù)(補(bǔ)碼),其相鄰兩數(shù)之間差值不超過
;* -8至7。對這種變化緩慢的數(shù)據(jù)可采用差分方法進(jìn)行壓縮。即第一
;* 個數(shù)據(jù)不變,其后的數(shù)據(jù)取與前一數(shù)據(jù)的差值并用四位二進(jìn)制補(bǔ)碼
;* 表示, 兩個差值拼成一個字節(jié), 前一個差值放在高四位,后一個差
;* 值放在低四位。
;* 例如:
;* 原數(shù)據(jù)(X[n]): 23H,27H,2AH,29H,22H,...
;* 壓縮后(Y[n]): 23H, 43H, F9H,...
;* 編程按上述方法進(jìn)行壓縮, 結(jié)果保存在RESULT開始的內(nèi)存單
;* 元中。
;* 部分程序已在PROG1.ASM中給出, 請?zhí)羁誃EGIN和END之間已給
;* 出的源程序使其完整(空白已用橫線標(biāo)出, 每行空白一般只需一條
;* 指令, 但功能相當(dāng)?shù)亩鄺l指令亦可)或刪除BEGIN和END之間原有的
;* 代碼并自行編寫程序片段來完成要求的功能。
;* 原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT中讀入SOURCE開始的內(nèi)
;* 存單元中, 結(jié)果要求從RESULT開始存放, 由過程SAVE保存到文件
;* OUTPUT1.DAT中。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE 執(zhí)行文
;* 件, 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB 2*N+1 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
MOV ES,AX ; 置附加段寄存器
LEA DX,SOURCE ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名起始地址
MOV CX,2*N+1 ; 字節(jié)數(shù)
CALL LOAD ; 從"input1.dat"中讀取數(shù)據(jù)
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
CLD
MOVSB ; Y[0]=X[0]
XOR BX,BX ; FLAG=0
MOV DX,N*2 ; COUNTER
COMPRESS:
LODSB
sub al,[si-2]
xor bx,1
jz low_hex
;SUB _________ ; X[n]-X[n-1]
;____________________ ; FLAG=NOT FLAG
;J__ LOW_HEX
MOV CL,4
shl al,cl
;___ AL,CL
MOV AH,AL
JMP NEXT
LOW_HEX: and al,0fh
;__________________
OR AL,AH
STOSB
NEXT: dec dx
;___________________
JNE COMPRESS
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名起始地址
MOV CX,N+1 ; 字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到"output1.dat"文件中
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:[b]
17 1B 1E 24 29 2D 2A 25 20 27 2C 2F 34 37 33 31 36 3C 3F 39 33
[b]output1.dat 內(nèi)容應(yīng)當(dāng)如下:
17 43 65 4D BB 75 35 3C E5 63 AA
上機(jī)題之23
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著十六個
;* 10位二進(jìn)制數(shù)DB9 DB8 … DB0,每個二進(jìn)制數(shù)均用兩個字節(jié)表示,其
;* 存放格式均為
;* DB9 DB8 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0
;* │←─── 低地址字節(jié) ───→│ │←──高地址字節(jié)──→│
;* 請按序?qū)⒚總10位無符號二進(jìn)制數(shù)轉(zhuǎn)換成以下格式
;* DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 DB9 DB8
;* │←─── 低地址字節(jié)───→│ │←──高地址字節(jié)──→│
;* 轉(zhuǎn)換結(jié)果按原序存放在內(nèi)存中。
;* 例如:
;* 內(nèi)存中有 C048H,4091H,0080H,……
;* 結(jié)果為 23H,01H,45H,02H,00H,02H,……
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到OUTPUT1.DAT文件中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可), 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的
;* 功能。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)
;* 試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 16
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DW 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N*2 ; 字節(jié)數(shù)
CALL LOAD ; 從 'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV DI,OFFSET RESULT
MOV BX,0
MOV CH,N
PRO: MOV AH,BYTE PTR SOURCE[BX]
mov al,byte ptr source[bx+1]
;MOV AL,________________
MOV DL,AH ; 10位無符號二進(jìn)制數(shù)高八位
MOV DH,AL ; 10位無符號二進(jìn)制數(shù)低二位
MOV CL,2
shl ax,cl
;SHL AX,__
shl dx,cl
;SHL DX,__
MOV AL,DH
mov [di],ah
mov [di+1],al
;MOV [DI],__
;MOV [DI+1],__
ADD DI,2
ADD BX,2
DEC CH
JNZ PRO
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N*2 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
FF C0 F0 C0 FF 80 FF 40 FF 00 FA 40 FA 80 AA 40 CD 40 11 C0 00 00 31 80 31 40 66 40 66 C0 33 40
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
FF 03 C3 03 FE 03 FD 03 FC 03 E9 03 EA 03 A9 02
35 03 47 00 00 00 C6 00 C5 00 99 01 9B 01 CD 00
上機(jī)題之24
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著五個用
;* 壓縮型(組合型)BCD碼表示的十進(jìn)制數(shù),請將它們分別轉(zhuǎn)換成ASCII
;* 字符,高位的BCD碼轉(zhuǎn)換后放在較高的地址單元。
;* 例如:
;* 內(nèi)存中有
;* 21H,43H,... (共五個字節(jié))
;* 結(jié)果為
;* 31H('1'),32H('2'),33H('3'),34H('4'),...(共十個字節(jié))
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。 運算結(jié)果要求從RESULT開始存
;* 放, 由過程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之間
;* 已給出的源程序使其完整(空白已用橫線標(biāo)出,每行空白一般只需
;* 一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦可),或刪除BEGIN和END
;* 之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果 (無結(jié)果或結(jié)果不正確者均不得分)。
;* 調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 5
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
MOV ES,AX
LEA DX,SOURCE ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從'INPUT.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
CLD
NEXT: lodsb
;LODS__
MOV BL,AL
and al,0fh
;AND AL, ____
OR AL,30H
stosb
;STOS__
mov al,bl
;MOV AL, ____
push cx
;PUSH ____
mov cl,4
;MOV CL, ____
SAR AL,CL
pop cx
;POP ____
OR AL,30H
stosb
;STOS__
LOOP NEXT
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N*2 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
78 25 32 49 71
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
38 37 35 32 32 33 39 34 31 37
上機(jī)題之25
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著兩個無
;* 符號字節(jié)數(shù)序列Ak和Bk(k=0,…,9),求序列Ck,Ck=Ak÷Bk(運算
;* 結(jié)果按序以字的形式連續(xù)存放,其中低字節(jié)為商,高字節(jié)為余數(shù))。
;* 例如:
;* 序列Ak為01H,7FH,80H,FFH,…;
;* 序列Bk為FFH,80H,7FH,01H,…。
;* 結(jié)果Ck為0100H(00H為商、01H為余數(shù)),7F00H,0101H,00FFH,…。
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中,運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出, 每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可), 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的
;* 功能。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)
;* 試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N*2 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N*2 ; 字節(jié)數(shù)
CALL LOAD ; 從'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV DI,OFFSET RESULT
MOV BX,0
mov cx,N
;______________________
PRO: mov ah,0
mov al,source[bx]
div source[bx+N]
;MOV _________
;_____________,SOURCE[BX]
;DIV ___________
mov [di],ax
;MOV [DI],___
ADD DI,2
inc bx
;_______________________
DEC CX
jnz pro
;___ PRO
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,2*N ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
01 7F 80 FF 00 FF 80 7F 01 80 FF 80 7F 01 FF 80 40 01 01 7F
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
00 01 00 7F 01 01 FF 00 00 00 01 7F 02 00 7F 00
01 00 01 01
上機(jī)題之26
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放的二十
;* 個八位有符號數(shù)(補(bǔ)碼)是由一個八位A/D轉(zhuǎn)換器采集的雙極性信
;* 號(Xn), 現(xiàn)要求對該信號作如下處理(處理后的信號記為Yn):
;* a). Yn= Xn+5 Xn<-5
;* b). Yn= 0 │Xn│<=5
;* c). Yn= Xn-5 Xn>5
;* 例如:
;* Xn: 03H,FEH(-2),4EH,A2H(-94), ...
;* Yn: 00H,00H, 49H,A7H(-89), ...
;* 部分程序已在PROG1.ASM中給出, 請?zhí)羁誃EGIN和END之間已給
;* 出的源程序使其完整(空白已用橫線標(biāo)出, 每行空白一般只需一條
;* 指令, 但功能相當(dāng)?shù)亩鄺l指令亦可)或刪除BEGIN和END之間原有的
;* 代碼并自行編寫程序片段來完成要求的功能。
;* 原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT中讀入SOURCE開始的內(nèi)
;* 存單元中, 結(jié)果要求從RESULT開始存放, 由過程SAVE保存到文件
;* OUTPUT1.DAT中。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE 執(zhí)行文
;* 件, 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
DELTA EQU 5
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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名起始地址
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從"input1.dat"中讀取數(shù)據(jù)
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
mov cx,N
;____________________
NEXT: MOV AL,[SI]
CMP AL,-DELTA
jl less
;J__ LESS
CMP AL,DELTA
jg great
;J__ GREAT
MOV AL,0
JMP STORE
GREAT: SUB AL,DELTA
JMP STORE
LESS: ADD AL,DELTA
STORE: MOV [DI],AL
inc di
inc si
loop next
;____________________
;____________________
;____________________
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名起始地址
MOV CX,N ; 字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到"output1.dat"文件中
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
01 03 FE 06 13 44 78 30 FC C5 92 C5 FE 04 57 61 79 4A 05 FC
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
00 00 00 01 0E 3F 73 2B 00 CA 97 CA 00 00 52 5C
74 45 00 00
上機(jī)題之27
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著兩個無
;* 符號字節(jié)數(shù)序列Ak和Bk (k=0,…,9),求序列Ck,Ck=Ak-Bk(Ck以
;* 有符號字的形式按C0,…,C9的順序連續(xù)存放)。
;* 例如:
;* 序列Ak為30H,FFH,80H,FFH,…;
;* 序列Bk為00H,FFH,FFH,0AH,…。
;* 結(jié)果Ck為0030H,0000H,FF81H,FFF5H, …。
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中,運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可), 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的
;* 功能。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件, 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)
;* 試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N*2 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N*2 ; 字節(jié)數(shù)
CALL LOAD ; 從'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV DI,OFFSET RESULT ; 結(jié)果從RESULT開始存放
MOV BX,0
mov cx,N
;________________
PRO: MOV AH,0
MOV AL,SOURCE[BX] ; 序列Ak中的一個字節(jié)
sub al,source[bx+N]
;SUB AL,_______________ ; Ck=Ak-Bk
jnc jump
;____ JUMP ; 無借位轉(zhuǎn)JUMP
mov ah,0ffh
;MOV AH,_____ ; 有借位轉(zhuǎn)換成有符號字(為負(fù))
JUMP: mov [di],ax
;MOV ____,AX
ADD DI,2
INC BX
DEC CX
JNZ PRO
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N*2 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
FF 80 7F 00 7F 80 FF 80 81 00 FF FF 80 00 7F 00 00 81 FE FF
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
00 00 81 FF FF FF 00 00 00 00 80 00 FF 00 FF FF
83 FF 01 FF
上機(jī)題之28
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM,其功能是:
;* 內(nèi)存中共有30個字節(jié)型數(shù)據(jù),找出其中的兩個ASCII字符串并進(jìn)
;* 行校驗。欲尋找的ASCII字符串由13個字符組成: #(23H),7個ASCII
;* 字符,*(2AH),2個ASCII字符,回車符(0DH),換行符(0AH)。
;* 校驗方法為: 對字符#及字符*之間的7個ASCII字符進(jìn)行異或操
;* 作, 若異或操作結(jié)果的ASCII字符表示(異或操作結(jié)果高4位的ASCII
;* 字符表示在前, 低4位的ASCII字符表示在后)與原字符串中字符*之
;* 后的兩個ASCII字符相同, 則將原字符串原樣保存; 反之,則將原字
;* 符串中的所有字符(共13個)均用字符!(21H)代替。
;* 例如:
;* 內(nèi)存中有 33H,35H,23H('#',第一個字符串開始),46H,41H,30H,
;* 2EH,34H,3DH,31H,2AH('*'),32H,31H,0DH,0AH,46H,23H('#',第二個
;* 字符串開始), 46H,41H,30H,2EH,34H,3DH,30H,2AH('*'),32H,31H,
;* 0DH,0AH,55H
;* 結(jié)果為 23H,46H,41H,30H,2EH,34H,3DH,31H,2AH('*'),32H,
;* 31H(校驗正確,該字符串原樣保持),0DH,0AH,21H,21H,21H,21H,21H,
;* 21H,21H,21H,21H,21H,21H,21H,21H(校驗錯, 整個字符串用字符'!'
;* 代替)
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整(空白已用橫線標(biāo)
;* 出,每行空白一般只需一條指令, 但采用功能相當(dāng)?shù)亩鄺l指令亦可),
;* 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進(jìn)行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文件,
;* 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)試中
;* 若發(fā)現(xiàn)整個程序中存在錯誤之處, 請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 26
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N+4 DUP(?)
RESULT DB N DUP(0)
HH DB 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N+4 ; 字節(jié)數(shù)
CALL LOAD ; 從 'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV SI,0
MOV DI,0
MOV BX,2 ; 兩個ASCII字符串
REPEAT: MOV AH,0
SEARCH: MOV AL,SOURCE[SI]
INC SI
CMP AL,'#'
jne search
;___ SEARCH
MOV RESULT[DI],AL
INC DI
SEARCH1: MOV AL,SOURCE[SI]
INC SI
cmp al,'*'
;CMP AL,___
JE ASCII
MOV RESULT[DI],AL
INC DI
XOR AH,AL
jmp search1
;JMP _______
ASCII: MOV RESULT[DI],AL
INC DI
PUSH DI
MOV DI,0
MOV DH,2
MOV DL,AH ; 異或結(jié)果暫存在DL中
MOV CL,4 ; 先將異或結(jié)果高4位轉(zhuǎn)換成ASDCII字
; 符
SHR AH,CL ; 本行開始的4行語句將一個十六進(jìn)制數(shù)
; 轉(zhuǎn)換為ASCII碼
CHANGE: CMP AH,10
JL ADD_0
ADD AH,'A'-'0'-10
ADD_0: ADD AH,'0'
MOV HH[DI],AH
INC DI
DEC DH
JZ EXT
MOV AH,DL ; 再將異或結(jié)果低4位轉(zhuǎn)換成ASDCII字符
AND AH,0FH
JMP CHANGE
EXT: POP DI
MOV AL,SOURCE[SI]
MOV RESULT[DI],AL
INC SI
INC DI
MOV AH,SOURCE[SI]
MOV RESULT[DI],AH
INC SI
INC DI
MOV DL,HH
MOV DH,HH+1
CMP AX,DX
jne err
;___ ERR
MOV AL,0DH ; 校驗正確
MOV RESULT[DI],AL
INC DI
MOV AL,0AH
MOV RESULT[DI],AL
INC DI
JMP LP
ERR: SUB DI,11 ; 校驗錯誤
MOV AL,'!'
mov cx,13
;MOV CX,___
COVER: MOV RESULT[DI],AL
INC DI
LOOP COVER
LP: dec bx
;________________
JZ EXIT
JMP REPEAT
EXIT: NOP
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
55 23 0A 40 0A 40 0A 40 00 2A 34 42 0D 0A 55 55 55 23 46 41 30 2E 33 3D 31 2A 32 36 0D 0A
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
21 21 21 21 21 21 21 21 21 21 21 21 21 23 46 41
30 2E 33 3D 31 2A 32 36 0D 0A
output1.hex 內(nèi)容應(yīng)當(dāng)如下:
DEDEDEDEDEDEDEDEDEDEDEDEDEDCB9BECFD1CCC2CED5CDC9F2F5FF
上機(jī)題之29
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM,其功能是:
;* 對內(nèi)存中兩個由7個ASCII字符組成的字符串進(jìn)行如下操作:
;* 在原字符串之前加上字符#(23H); 在原字符串之后加上字符*
;* (2AH)及另外兩個ASCII字符, 這兩個ASCII字符為原字符串中各字
;* 符(但不包括字符#和*)異或操作后的ASCII碼(異或操作結(jié)果的高4
;* 位的ASCII碼在前, 低4位的ASCII碼在后); 最后加上回車符(0DH)
;* 及換行符(0AH)。
;* 例如:
;* 內(nèi)存中有 46H,41H,30H,2EH,34H,3DH,31H(第一個ASCII字符串),
;* 46H,41H,30H,2EH,34H,3DH,30H(第二個ASCII字符串)
;* 結(jié)果為 23H('#'),46H,41H,30H,2EH,34H,3DH,31H,2AH('*'),
;* 32H,31H,0DH,0AH,23H,46H,41H,30H,2EH,34H,3DH,
;* 30H,2AH,32H,30H,0DH,0AH
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整(空白已用橫線標(biāo)
;* 出,每行空白一般只需一條指令, 但采用功能相當(dāng)?shù)亩鄺l指令亦可),
;* 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進(jìn)行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文件,
;* 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)試中
;* 若發(fā)現(xiàn)整個程序中存在錯誤之處, 請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 14
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?)
RESULT DB N+12 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從 'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV SI,0
MOV DI,0
MOV BX,2 ; 兩個ASCII字符串
REPEAT: MOV CX,7 ; 每個字符串由7個ASCII字符組成
mov al,'#'
;MOV AL,___
MOV RESULT[DI],AL
INC DI
mov ah,0
;MOV AH,___
CHAR: MOV AL,SOURCE[SI]
MOV RESULT[DI],AL
INC DI
INC SI
XOR AH,AL
loop char
;LOOP ________
mov al,'*'
;MOV AL,___
MOV RESULT[DI],AL
INC DI
MOV DH,2
MOV DL,AH ; 異或結(jié)果暫存在DL中
MOV CL,4 ; 先將異或結(jié)果高4位轉(zhuǎn)換成ASDCII字符
SHR AH,CL
CHANGE: CMP AH,10 ; 本行開始的4行語句將一個十六進(jìn)制數(shù)
; 轉(zhuǎn)換為ASCII碼
JL ADD_0
ADD AH,'A'-'0'-10
ADD_0: ADD AH,'0'
MOV RESULT[DI],AH
INC DI
DEC DH
JZ EXT
MOV AH,DL ; 再將異或結(jié)果低4位轉(zhuǎn)換成ASDCII字符
AND AH,0FH
JMP CHANGE
EXT: mov al,0dh
;MOV AL,___
MOV RESULT[DI],AL
INC DI
mov al,0ah
;MOV AL,___
MOV RESULT[DI],AL
INC DI
DEC BX
jz exit
;JZ ______
JMP REPEAT
EXIT: NOP
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N+12 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
46 41 30 2E 33 3D 31 0A 40 0A 40 0A 40 00
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
23 46 41 30 2E 33 3D 31 2A 32 36 0D 0A 23 0A 40
0A 40 0A 40 00 2A 34 41 0D 0A
上機(jī)題之30
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著16個十
;* 六位二進(jìn)制數(shù),在原16個數(shù)的第4和第5個數(shù)之間插入00FFH,在原
;* 16個數(shù)的第8和第9個數(shù)之間插入FF00H,在原16個數(shù)的第12和第13
;* 個數(shù)之間插入55AAH, 在原16個數(shù)的最后加入AA55H。將按上述方
;* 法插入4個數(shù)后得到的20個數(shù)存入內(nèi)存中。
;* 例如:
;* 內(nèi)存中有 1020H,2002H,3033H,4440H,5008H,…,8FF8H
;* (共16個字)
;* 結(jié)果為 1020H,2002H,3033H,4440H,00FFH,5008H,…,8FF8H,
;* AA55H(共20個字)
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可),或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功
;* 能。
;* 對程序必須進(jìn)行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)
;* 試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 16
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DW N DUP(?)
INDATA DW 0AA55H,55AAH,0FF00H,00FFH
RESULT DW 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N*2 ; 字節(jié)數(shù)
CALL LOAD ; 從 'INPUT1.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
MOV SI,0
mov di,0
;_______________
MOV CX,4
MOV BX,8
CHAN: MOV AX,SOURCE[SI]
mov result[di],ax
;_______________________
INC SI
inc si
inc di
;_____________
;_____________
INC DI
DEC CX
JZ INSER1
JMP CHAN
INSER1: PUSH SI
MOV SI,BX
MOV AX,INDATA[SI-2]
mov result[di],ax
;MOV RESULT[DI],__
DEC BX
dec bx
;_____________
JZ EXIT
mov cx,4
;MOV CX,___
POP SI
INC DI
inc di
;_______________
JMP CHAN
EXIT: POP SI
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,(N+4)*2 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
34 12 FF E0 0D 23 78 AC AE EA 15 86 F0 05 7F F7 11 FE DD 3E ED DD 33 55 CC CC 11 22 33 DC A0 0A
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
34 12 FF E0 0D 23 78 AC FF 00 AE EA 15 86 F0 05
7F F7 00 FF 11 FE DD 3E ED DD 33 55 AA 55 CC CC
11 22 33 DC A0 0A 55 AA