上機題之41
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM,其功能是: 內(nèi)存中連續(xù)存放著二十個無
;* 符號8位二進制數(shù), 每個數(shù)為搖號機一次搖出的兩個號碼的壓縮BCD
;* 碼表示, 每個號碼為1至4之間的數(shù)。現(xiàn)統(tǒng)計此二十次搖號中兩號碼
;* 相加值分別為2、3、4、5、6、7、8的次數(shù),將結(jié)果存入內(nèi)存。
;* 例如:
;* 內(nèi)存中有 12H,32H,31H,11H,22H,24H,41H,44H,11H,14H,
;* 33H,21H,13H,33H,23H,42H,22H,34H,43H,11H
;* 結(jié)果為 03H,02H,04H,04H,04H,02H,01H
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整(空白已用橫線標(biāo)
;* 出,每行空白一般只需一條指令, 但采用功能相當(dāng)?shù)亩鄺l指令亦可),
;* 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文件,
;* 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)試中
;* 若發(fā)現(xiàn)整個程序中存在錯誤之處, 請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?) ; 順序存放十個字節(jié)數(shù)
RESULT DB 7 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 SI,SOURCE
MOV CX,20
AGN0: mov bx,0
;MOV __,0
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
add al,ah
;ADD AL,__
add bl,al
;ADD __,__
ADC BH,0
sub bx,2
;___ BX,2
inc result[bx]
;_______________
INC SI
NEXT: LOOP AGN0
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,7 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
13 24 22 31 12 41 43 14 11 44 21 23 24 32 33 34 41 42 43 44
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
01 02 03 05 04 03 02
上機題之42
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著20個十六
;* 位二進制無符號數(shù)序列,請將它們排成升序(從小到大)。
;* 例如:
;* 內(nèi)存中有
;* 7001H,7004H,7002H, ...(假設(shè)后十七個字均大與7004H)
;* 結(jié)果為
;* 7001H,7002H,7004H, ...(后跟十七個字,按從小到大的順
;* 序排列)
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。 運算結(jié)果要求從RESULT開始存
;* 放,由過程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之間
;* 已給出的源程序使其完整(空白已用橫線標(biāo)出,每行空白一般只需
;* 一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦可),或刪除BEGIN和END
;* 之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果 (無結(jié)果或結(jié)果不正確者均不得分)。
;* 調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DW 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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N*2 ; 字?jǐn)?shù)
CALL LOAD ; 從 'INPUT.DAT'中讀取數(shù)據(jù)
; **** BEGIN ****
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
NEXT0: MOV AX,[SI]
MOV [DI],AX
add si,2
;ADD SI,_____
add di,2
;_________________
loop next0
;LOOP _____
CLD
MOV BX,N-1
MAL1: LEA SI,RESULT
mov cx,bx
;MOV CX,______________
NEXT: lodsw
;LOD____
CMP [SI],AX
JAE CONT
xchg [si],ax
;XCHG [SI],____
MOV [SI-2],AX
CONT: loop next
;LOOP _____
dec bx
;_______________
jnz mal1
;______ MAL1
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N*2 ; 結(jié)果字?jǐn)?shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
A829127C44D91035493048102030400060706E19
91829127C44D91035493048102030400060706E1
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
04 00 40 00 02 03 91 03 06 07 48 10 6E 19 91 27
A8 29 20 30 49 30 10 35 C4 4D 60 70 12 7C 04 81
91 82 54 93 44 D9 06 E1
上機題之43
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 將十進制數(shù)的ASCII碼轉(zhuǎn)換
;* 為BCD碼,并按照組合(壓縮)格式存放在內(nèi)存區(qū)中。 該ASCII字符串
;* 以00H作為結(jié)束標(biāo)志,若被轉(zhuǎn)換的ASCII碼為奇數(shù)個, 則把地址最低
;* 的ASCII碼按照非組合(非壓縮)BCD碼格式轉(zhuǎn)換。
;* 例如:
;* 內(nèi)存中有 31H,32H,33H,34H,35H,00H
;* 結(jié)果為 01H,32H,54H
;* 部分程序已經(jīng)給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中, 轉(zhuǎn)換結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已經(jīng)給出的一段源程序使其完整, 填空處
;* 已經(jīng)用橫線標(biāo)出, 每個空白一般只需要填一條指令或指令的一部分
;* (指令助記符或操作數(shù)), 考生也可以填入功能相當(dāng)?shù)亩鄺l指令, 或
;* 刪去BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文件,
;* 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
DSEG SEGMENT
SOURCE DB N DUP(?)
RESULT DB N/2 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 ***
MOV CX,0
LEA BX,SOURCE
NEXT: MOV AL,[BX]
CMP AL,0
JZ GOON
INC CX
INC BX
JMP NEXT
GOON: LEA SI,SOURCE
LEA DI,RESULT
ROR CX,1 ;是偶數(shù)嗎?
JNC EVN ;是
ROL CX,1 ;否
LODSB
and al,0fh
;AND __,0FH
STOSB
DEC CX
ROR CX,1
EVN: LODSB
and al,0fh
;AND __,0FH
MOV BL,AL
LODSB
PUSH CX
mov cl,4
sal al,cl
;MOV CL,___
;SAL AL,___
POP CX
or al,bl
;___ AL,BL
STOSB
LOOP EVN
; *** END ***
EXIT: LEA DX,RESULT
LEA SI,NAME1
MOV CX,N/2
CALL SAVE
RET
START ENDP
CSEG ENDS
END START
input1.dat 內(nèi)容如下:
3132333435363738393132333435363738393100
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
01 32 54 76 98 21 43 65 87 19
上機題之44
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著5個遞增
;* 的無符號8位二進制數(shù), 此5個數(shù)分別對應(yīng)于某非線性溫度傳感器在
;* 溫度0℃、3℃、6℃、9℃和12℃時的輸出值Yn(n=0、3、6、9、12),
;* 現(xiàn)采用分段線性插值法求出傳感器在溫度1℃、2℃、4℃、5℃、
;* 7℃、8℃、10℃和11℃時的近似輸出值Yk(k=1、2、4、5、7、8、
;* 10、11), Yk取整數(shù),其公式為
;* Yk=[(Y[n+3]-Y[n])/3]*(k-n)+Yn,其中k=n+1、n+2,n=0、3、6、9,將結(jié)
;* 果存入內(nèi)存。
;* 例如:
;* 內(nèi)存中有 01H,0AH,19H,31H,5EH
;* 結(jié)果為 04H,07H,0FH,14H,21H,29H,40H,4FH
;* 部分程序已給出, 其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整(空白已用橫線標(biāo)
;* 出,每行空白一般只需一條指令, 但采用功能相當(dāng)?shù)亩鄺l指令亦可),
;* 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編,并與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(?) ; 順序存放十個字節(jié)數(shù)
RESULT DB 8 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,4
mov dl,3
;__________________
AGN0: MOV BL,[SI]
INC SI
MOV AL,[SI]
SUB AL,BL
mov dh,al
;_________________
MOV BH,1
AGN1: mul bh
;MUL ___
DIV DL
add al,bl
;ADD __,BL
MOV [DI],AL
INC DI
mov al,dh
;_________________
INC BH
cmp bh,2
;CMP BH,__
JNA AGN1
LOOP AGN0
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,8 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
07 16 2E 55 91
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
0C 11 1E 26 3B 48 69 7D
上機題之45
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中存放著16個以八位
;* 二進制數(shù)表示的0~9之間的數(shù)字(包括數(shù)字0和9),請將它們轉(zhuǎn)換為
;* 相應(yīng)的ASCII字符,并且在原第1、5、9、13個數(shù)字前插入ASCII字
;* 符'$'(24H)。 將按上述方法插入4個字符'$'后得到的20個字符存
;* 入內(nèi)存中。
;* 例如:
;* 內(nèi)存中有 00H,01H,01H,01H,02H,…,09H(共16個字節(jié))
;* 結(jié)果為 24H('$'),30H('0'),31H('1'),31H('1'),31H('1'),
;* 24H('$'),32H('2'),…,39H('9')(共20個字節(jié))
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可),或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的功
;* 能。
;* 對程序必須進行匯編, 并與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 DB N DUP(?)
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 ; 數(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 CX,4
mov bx,5
;MOV BX,__
INSER1: DEC BX
JZ EXIT
MOV RESULT[DI],24H
inc di
;_______________
MOV CX,4
CHAN: MOV AL,SOURCE[SI]
or al,30h
;_____________________
MOV RESULT[DI],AL
inc si
;______________
INC DI
DEC CX
jz inser1
;JZ _______
JMP CHAN
EXIT: NOP
; **** END ****
LEA DX,RESULT ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N+4 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
09 07 05 03 00 02 04 06 08 06 04 02 00 03 05 07
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
24 39 37 35 33 24 30 32 34 36 24 38 36 34 32 24
30 33 35 37
上機題之46
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著二十個
;* 無符號字節(jié)數(shù),求它們的和。和值按字的形式存放, 此前先按序
;* 存放參加運算的二十個字節(jié)。
;* 例如:
;* 內(nèi)存中有 01H,02H,03H, ...
;* 結(jié)果為 01H,02H,03H, ...(共二十個參加運算的字節(jié)),后
;* 跟一個字(為前面各二十個字節(jié)的和)。
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中, 運算結(jié)果要求從RESULT開始存
;* 放,由過程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之間
;* 已給出的源程序使其完整(空白已用橫線標(biāo)出,每行空白一般只需
;* 一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦可),或刪除BEGIN和END
;* 之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果 (無結(jié)果或結(jié)果不正確者均不得分)。
;* 調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
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 ; 數(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
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 ; 結(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)容如下:
41 72 AB 35 39 CF 48 43 44 45 39 32 38 41 48 37 36 35 38 37
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
41 72 AB 35 39 CF 48 43 44 45 39 32 38 41 48 37
36 35 38 37 EC 05
上機題之47
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM,其功能是:內(nèi)存中連續(xù)存放著20個ASCII
;* 字符,如果是大寫字母A至Z之間的字符,請把它們轉(zhuǎn)換成相應(yīng)的小
;* 寫字母的ASCII字符(否則不作轉(zhuǎn)換)并統(tǒng)計原20個ASCII字符中字
;* 符“A”的個數(shù)。 轉(zhuǎn)換結(jié)果(包括不作轉(zhuǎn)換的非A~Z之間的原ASCII
;* 字符)按序存入內(nèi)存中,之后存放原20個ASCII字符中為字符“A”
;* 的個數(shù)(用一個字節(jié)表示)。
;* 例如:
;* 內(nèi)存中有30H('0'),31H('1'),61H('a'),41H('A'),42H('B'),…
;* 結(jié)果為 30H,31H,61H,61H,62H,…,后跟用一個字節(jié)表示的原20
;* 個ASCII字符中字符“A”的個數(shù)
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可), 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的
;* 功能。
;* 對程序必須進行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。調(diào)
;* 試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從 'INPUT1.DAT'中讀取數(shù)據(jù)
; **** 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 ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N+1 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
30 40 31 41 32 42 33 43 34 44 35 45 61 48 5B 5A 7A 7B 60 7F
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
30 40 31 61 32 62 33 63 34 64 35 65 61 68 5B 7A
7A 7B 60 7F 01
上機題之48
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 對經(jīng)常上下波動的數(shù)據(jù)采
;* 用只記錄峰值的數(shù)據(jù)壓縮方法,即每次將采樣到的當(dāng)前值和前一次
;* 值比較, 如數(shù)據(jù)變化方向改變 (原變大現(xiàn)變小或原變小現(xiàn)變大),
;* 說明已過峰值, 這時就將當(dāng)前值記錄下來。
;* 例如(下列數(shù)據(jù)均為無符號數(shù)):
;* 原數(shù)據(jù): 23H,45H,89H,67H,5CH,36H,3CH,78H,...
;* 壓縮后: 23H,67H,3CH,...
;* 內(nèi)存中從SOURCE開始連續(xù)存放著四十個八位無符號數(shù), 假定相
;* 鄰兩數(shù)無相等的情況, 編程按上述方法進行壓縮, 結(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中。
;* 對程序必須進行匯編, 并與IO.OBJ鏈接產(chǎn)生PROG1.EXE 執(zhí)行文
;* 件, 最終運行程序產(chǎn)生結(jié)果(無結(jié)果或結(jié)果不正確者均不得分)。
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 ; 數(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
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 ; 相同, 則數(shù)據(jù)改變方向未變
stosb
;____________________ ; 不同, 方向變化, 保存當(dāng)前值
SKIP: mov dx,bx
;____________________
LOOP FILTER
; **** 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)容如下:
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 內(nèi)容應(yīng)當(dāng)如下:
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
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著二十個
;* 有符號字節(jié)數(shù)序列,求出該序列的最大值和最小值。 結(jié)果存放形
;* 式為:先按原序存放二十個需處理的有符號字節(jié)數(shù)序列,后跟該序
;* 列的最大值和最小值(最大值在前,最小值在后)。
;* 例如:
;* 內(nèi)存中有 81H,02H,03H, ...
;* 結(jié)果為 81H,02H,03H, ... (共二十個需處理的原有符號字
;* 節(jié)序列),后跟該序列的最大值和最小值 (最大值在前,最小值在
;* 后)。
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中, 運算結(jié)果要求從RESULT開始存
;* 放,由過程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之間
;* 已給出的源程序使其完整(空白已用橫線標(biāo)出, 每行空白一般只需
;* 一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦可),或刪除BEGIN和END
;* 之間原有的代碼并自行編程來完成要求的功能。
;* 對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生PROG1.EXE執(zhí)行文
;* 件,最終運行程序產(chǎn)生結(jié)果 (無結(jié)果或結(jié)果不正確者均不得分)。
;* 調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
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 ; 數(shù)據(jù)區(qū)起始地址
LEA SI,NAME0 ; 原始數(shù)據(jù)文件名
MOV CX,N ; 字節(jié)數(shù)
CALL LOAD ; 從'INPUT'中讀取數(shù)據(jù)
; **** BEGIN ****
; 最大值放在BH中,最小值放在BL中
LEA SI,SOURCE
lea di,result
;LEA ____,RESULT
MOV BH,[SI] ; 第一個字節(jié)既為最大值
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 ; 結(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)容如下:
12 34 23 45 75 98 00 87 FF AC D4 6E 8B A9 28 39 88 77 24 DE
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
12 34 23 45 75 98 00 87 FF AC D4 6E 8B A9 28 39
88 77 24 DE 77 87
上機題之50
以下內(nèi)容為程序代碼:
;* 請編制程序PROG1.ASM, 其功能是: 內(nèi)存中連續(xù)存放著10個十六
;* 位二進制數(shù),每個數(shù)的序號依次定義為0,1,…9。統(tǒng)計每個數(shù)中位為
;* 0的個數(shù)N0, N1,…, N9(均用一個字節(jié)表示),然后按序?qū)0至N9存
;* 入內(nèi)存中,最后再用一個字節(jié)表示這10個數(shù)中為0的位的總數(shù)n
;* (n= N0+ N1+…+N9)。
;* 例如:
;* 內(nèi)存中有 0000H,000FH,FFFFH,…
;* 結(jié)果為 10H,0CH,00H,…,最后為n
;* 部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT
;* 中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,
;* 由過程SAVE保存到文件OUTPUT1.DAT中。
;* 填空BEGIN和END之間已給出的源程序使其完整 (空白已用橫線
;* 標(biāo)出,每行空白一般只需一條指令,但采用功能相當(dāng)?shù)亩鄺l指令亦
;* 可), 或刪除BEGIN和END之間原有的代碼并自行編程來完成要求的
;* 功能。
;* 對程序必須進行匯編, 并與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 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 ; 數(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 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 ; 結(jié)果數(shù)據(jù)區(qū)首址
LEA SI,NAME1 ; 結(jié)果文件名
MOV CX,N+1 ; 結(jié)果字節(jié)數(shù)
CALL SAVE ; 保存結(jié)果到文件
RET
START ENDP
CODE ENDS
END START
input1.dat 內(nèi)容如下:
00 00 01 00 FF FF AA AA 55 55 55 AA 33 33 77 77 00 10 10 00
output1.dat 內(nèi)容應(yīng)當(dāng)如下:
10 0F 00 08 08 08 08 04 0F 0F 61