AGAIN: MOV BX,AX 18
AND BX,000FH ADD BL,30H CMP BL,'9' JG ADUST JMP STORE
ADUST: ADD BL ,07H STORE: MOV [SI],BL INC SI MOV CL,4 ROL AX,CL DEC DL JNZ AGAIN MAIN ENDP CODE ENDS END START
4.14 编写一个子程序将AX 中的2 进制数,转换成10 进制ASCII 码, 元中。
【答】参考程序:
BIN EQU 5555H;假设二进制数为5555H DATA SEGMENT ADR DB 4 DUP(?) DATA ENDS
STACK SEGMENT
STA DB 100 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV AX,BIN LEA BX,ADR MOV CX,10000D CALL BINTODEC MOV CX,1000D CALL BINTODEC MOV CX,100D
存于ADR 开始的五个单
CALL BINTODEC MOV CX,10D CALL BINTODEC MOV CX,01D CALL BINTODEC 19
MOV AX,04CH ;返回DOS INT 21H MAIN ENDP
;十进制转二进制,完成一位运算,十进制存于ax 中,结果存于bx 所指向的地址中 BINTODEC PROC NEAR MOV DX,0 DIV CX
ADD AL,30H MOV [BX],AL MOV AX,DX INC BX RET
BINTODEC ENDP CODE ENDS END START
4.15 编写一个子程序,对AL 中的数据进行偶校验,并将经过校验的结果放回AL 中。 【答】参考程序: JIAOYAN PROC FAR MOV AL,1001110B OR AL, AL JNP NEXT MOV AL,0 JMP DONE
NEXT: MOV AL,1 DONE: MOV AH,04CH INT 21H
JIAOYAN ENDP
4.16 从2000H 单元开始的区域,存放100 个字节的字符串,其中有几个$符号(ASCII 码为24), 找出第一个$符号,送AL 中,地址送BX。 【答】参考程序: SEARCH PROC FAR MOV DI,2000H MOV CX,100 MOV AL,24H CLD
REPNZ SCASB JNZ STOP DEC DI
MOV BX,DI MOV AL,[DI] STOP: RET SEARCH ENDP
4.17 用串操作指令实现:先将100H 个数从2170H 单元处搬到1000H 单元处,然后从中检索等 20
于AL 中字符的单元,并将此单元换成空格字符。 【答】参考程序: MOV AL,24H MOV SI,2170H MOV DI,1000H MOV CX,100H CLD
DO: REP MOVSB MOV DI,1000H MOV CX,100H CLD
REPNZ SCASB DEC DI
MOV [DI],20H INC DI CMP CX,0 JNZ DO HLT
4.18 从60H 个元素中寻找一个最大的值,并放到AL 中,假设这60 个元素放在DATA1 开始的 单元中。
【答】参考程序: DATA SEGMENT
DATA1 DB 0,1,2,3,4,5,6,7,8,9 ; DATA ENDS
STACK SEGMENT
STA DB 20 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV CX,10 MOV AL,0
LEA BX,DATA1
AGAIN: CMP AL,[BX] JGE NEXT ;大于等于转移 MOV AL,[BX] NEXT : INC BX LOOP AGAIN MOV AH,4CH INT 21H 21
CODE ENDS END START
4.19 排序程序设计: 把表中元素按值的大小升序排列。要求显示排序前和排序后的数据。 【答】参考程序: DATA SEGMENT
TAB DB '8095554' N=$-TAB
OK DB 0DH,0AH,'OK!$' DATA ENDS
STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STAC ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK STAR: MOV AX,DATA
MOV DS,AX ;初始化数据段 MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX CALL ARRAY DO: MOV AH,4CH INT 21H ;返回DOS ARRAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX
MOV DL,N-1 ;置外循环次数 MOV DH,1 ;设有交换标志 XOR BX, BX
UPPER: OR DH,DH ;
JZ DISP ;无交换,已排好序,退出 MOV DH,0 ;无交换
MOV CX,N-1
SUB CX,BX ;CX=CX-I 内循环次数 MOV SI,0 ;指向表首
INNER: MOV AL,TAB[SI] ;字符送AL INC SI ;指向下个字符
CMP AL,TAB[SI] ;比较表中相邻字符 JBE DON ;小于
XCHG AL,TAB[SI] ;否则交换,大字符下 MOV TAB[SI-1],AL ;小字符上浮 MOV DH,1 ;有交换,DH=1 22
DON: LOOP INNER ;内循环结束?CX-1 INC BX ;一次内循环完成,加一 DEC DL ;外循环次数减一 CMP DL,0
JNZ UPPER ;外循环次数非零,继续 DISP: MOV DX,OFFSET TAB MOV AH,09H
INT 21H ;显示排好序的字符 POP DX POP CX POP BX POP AX RET
ARRAY ENDP CODE ENDS END STAR
4.20 编写一段程序,接收从键盘输入的10 个数,输入回车符表示结束,然后将这些数加密 后存于BUFF 缓冲区中。加密表为:输入数字: 0,1,2,3,4,5,6,7,8,9;密码数字: 7,5,9,1,3,6,8,0,2,4。 【答】参考程序: DATA SEGMENT
TABLE DB 7,5,9,1,3,6,8,0,2,4;密码表 BUFF DB 10 DUP(?) ,'$'存放转换数字的缓冲区 DATA ENDS
STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT MOV AX,STACK MOV SS,AX
MOV DI , OFFSET BUFF LEA BX , TABLE