RET
BCDTOB2 ENDP
9. 编写两个通用过程,一个完成ASCII 码转换成二进制数功能,另一个完成ASCII 字符显 示输出功能。 答:(1)将AX 中两位ASCII 码先转化成数字,然后AH*10+AL。
子程序名:ASCIITOB2
输入参数:AX=2 位ASCII 码 输出参数:AX=转换后二进制数 使用寄存器:BX,CX,DX ASCIITOB2 PROC FAR PUSH BX PUSH CX PUSH DX MOV BX,AX SUB AH,30H MOV AL,AH
MOV CL,10 ;乘以10 MUL CL MOV DX,AX MOV AX,BX SUB AL,30H MOV AH,0 ADD AX,DX POP DX POP CX POP BX RET
ASCIITOB2 ENDP
(2)使用2 号DOS 功能调用显示字符。 子程序名:DISPLAY
输入参数:AX=2 位ASCII 码 输出参数:无
使用寄存器:BX,DX DISPLAY PROC FAR PUSH BX PUSH DX MOV BX,AX MOV DL,AH MOV AH,2 INT 21H MOV AX,BX MOV DL,AL
MOV AH,2 INT 21H POP DX POP BX RET
DISPLAY ENDP
10. 编制两个通用过程,完成十六进制数转换成ASCII 码并将ASCII 码字符显示。 答:(1)子程序名:HEXTOASC 输入参数:AX:4 位十六进制数
输出参数:DX,AX:4 位ASCII 码,DX 高2 位,AX 低2 位使用寄存器:BX,CX,DX HEXTOASC PROC FAR PUSH BX PUSH CX PUSH DX MOV BX,AX
MOV CL,4 ;转换AH 高4 位 SHR AX,CL AND AX,0F00H ADD AH,30H CMP AH,3AH JB A1
ADD AH,7
A1: MOV DH,AH
MOV AX,BX ;转换AH 低4 位 AND AX,0F00H ADD AH,30H CMP AH,3AH JB A2
ADD AH,7
A2: MOV DL,AH
MOV BH,BL ;转换AL 高4 位 MOV CL,4 SHR BL,CL ADD BL,30H CMP BL,3AH JB A3 ADD BL,7
A3: MOV AH,BL
AND BH,0FH ;转换AL 低4 位 ADD BH,30H CMP BH,3AH JB A4
ADD BH,7
A4: MOV AL,BH POP DX POP CX POP BX RET
HEXTOASC ENDP
(2)子程序名:DISPLAYASC
输入参数:DX,AX:4 位ASCII 码 输出参数:无
使用寄存器:BX,CX DISPLAYASC PROC FAR PUSH BX PUSH CX MOV BX,DX MOV CX,AX MOV DL,BH MOV AH,02H INT 21H MOV DL,BL INT 21H MOV DL,CH INT 21H MOV DL,CL INT 21H MOV DL,?H? INT 21H POP CX POP BX RET
DISPLAYASC ENDP
11. 某程序可从键盘接收命令(0~5),分别转向6 个子程序,子程序入口地址分别为P0~
P5,编制程序,用跳转表实现分支结构。 答: DATA SEGMENT TABLE DW 6 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI, TABLE
MOV WORD PTR[SI],OFFSET P0 MOV WORD PTR[SI+2],OFFSET P1
MOV WORD PTR[SI+4],OFFSET P2 MOV WORD PTR[SI+6],OFFSET P3 MOV WORD PTR[SI+8],OFFSET P4 MOV WORD PTR[SI+10],OFFSET P5 MOV AH,1 INT 21H SUB AL,30H SHL AL,1 MOV AH,0 MOV SI,AX JMP TABLE[SI] P0: P1: P2: P3: P4: P5:
MOV AH,4CH INT 21H CODE ENDS END START
12. 在首地址为TABLE 的数组中按递增次序存放着100 个16 位补码数,编写一个程序,把
出现次数最多的数及其出现次数分别存放于AX 和BL 中。 答: DATA SEGMENT
TABLE DW 100 DUP (?) ;数组中的数据是按增序排列的 NUM DW ? COUNT DW 0 DATA ENDS
CODE SEGMENT MAIN PROC FAR
ASSUME CS: CODE, DS: DATA START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX
MOV AX, DATA
MOV DS, AX ;给DS 赋值
BEGIN: MOV CX, 100 ;循环计数器 MOV SI, 0
NEXT: MOV DX, 0 MOV AX, TABLE[SI]
COMP: CMP TABLE [SI], AX ;计算一个数的出现次数 JNE ADDR INC DX
ADD SI, 2 LOOP COMP
ADDR: CMP DX, COUNT ;此数出现的次数最多吗? JLE DONE
MOV COUNT, DX ;目前此数出现的次数最多,记下次数 MOV NUM, AX ;记下此数
DONE: LOOP NEXT ;准备取下一个数
MOV CX, COUNT ;出现最多的次数存入(CX) MOV AX, NUM ;出现最多的数存入(AX) RET
MAIN ENDP
CODE ENDS ;以上定义代码段 END START
13. 将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。
答:DATA SEGMENT
STRING DB 'INPUT 4 HEX NUM:',0AH,0DH,'$' NUM DB 10 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
LEA DX,STRING ;显示提示信息 MOV AH,9 INT 21H MOV BP,4 MOV DX,0
CONT: MOV CL,4 ;输入4 位十六进制数DX SHL DX,CL D1: MOV AH,1 INT 21H CMP AL,'0' JB D1
CMP AL,'F' JA D1
CMP AL,'A' JB A1 SUB AL,7
A1: SUB AL,30H MOV AH,0 ADD DX,AX DEC BP JNZ CONT