JA C1
CMP AL,'A' JB A1 SUB AL,7
A1: SUB AL,30H MOV AH,0 ADD NUM1[SI],AX POP CX
LOOP CONT
MOV DL,0DH ;回车换行 MOV AH,2 INT 21H
MOV DL,0AH INT 21H
LEA DX,STRING2 ;输入第二个加数(4 位十六进制数) MOV AH,9 INT 21H MOV SI,2 MOV CX,8 CONT1: PUSH CX CMP CX,4 JNZ B2 SUB SI,2
B2: MOV CL,4 SHL NUM2[SI],CL C2: MOV AH,1 INT 21H CMP AL,'0' JB C2
CMP AL,'F' JA C2
CMP AL,'A' JB A2 SUB AL,7 A2: SUB AL,30H MOV AH,0 ADD NUM2[SI],AX POP CX
LOOP CONT1
MOV DL,0DH ;回车换行 MOV AH,2 INT 21H
MOV DL,0AH INT 21H
LEA SI,NUM1 ;两数相加 LEA BX,NUM2 LEA DI,RESULT MOV CX,4 CLC
AD: MOV AL,[SI] ADC AL,[BX] MOV [DI],AL INC SI INC BX
INC DI LOOP AD
LEA DX,STRING3 ;显示结果(4 位十六进制数) MOV AH,9 INT 21H MOV CX,4
MOV DI,3 TT: PUSH CX
MOV DL,RESULT[DI] MOV CL,4 SHR DL,CL ADD DL,30H CMP DL,3AH JB D1 ADD DL,7 D1: MOV AH,2 INT 21H
MOV DL,RESULT[DI] AND DL,0FH ADD DL,30H CMP DL,3AH JB D2 ADD DL,7
D2: MOV AH,2 INT 21H DEC DI POP CX
LOOP TT
MOV AH,4CH ;返回DOS INT 21H CODE ENDS
END START
17. 编写2 位非压缩型BCD 码相乘的程序。 答:转化成加法进行累加运算。
DATA SEGMENT DA1 DB 09H,09H DA2 DB 09H,08H
RESULT DB 4 DUP(0) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AL,DA2+1 ;计算加法次数 MOV BL,10 MUL BL MOV BL,DA2 MOV BH,0
ADD AX,BX MOV CX,AX
CONT: MOV AH,0 ;通过循环做累加 MOV AL,RESULT ADD AL,DA1 AAA
MOV RESULT,AL MOV AL,RESULT+1 ADD AL,AH MOV AH,0 AAA
ADD AL,DA1+1 AAA
MOV RESULT+1,AL MOV AL,RESULT+2 ADD AL,AH MOV AH,0 AAA
MOV RESULT+2,AL MOV AL,RESULT+3 ADD AL,AH MOV AH,0 AAA
MOV RESULT+3,AL LOOP CONT
MOV AH,4CH ;返回DOS INT 21H
CODE ENDS END START
18. 编写完整的程序求N!,求N 大于6 时的运算结果,并在屏幕上显示结果。
答:DATA SEGMENT N DB 8 ;求8 的阶乘
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AL,N MOV AH,0
CALL FACT ;调用过程求N!,AX=N,BX=N!
CALL B2TODEC ;调用过程将结果转换为十进制,然后屏幕显示 MOV AH,4CH INT 21H FACT PROC CMP AL,0 JNZ CHN MOV BX,1 RET
CHN: PUSH AX
DEC AL
CALL FACT ;递归调用N!=N*(N-1)! POP AX MUL BX MOV BX,AX RET
FACT ENDP
B2TODEC PROC MOV CX,10000 CALL BIN MOV CX,1000 CALL BIN MOV CX,100 CALL BIN MOV CX,10 CALL BIN MOV CX,1 CALL BIN RET
B2TODEC ENDP BIN PROC MOV AX,BX MOV DX,0 DIV CX
MOV BX,DX
MOV DL,AL ADD DL,30H MOV AH,2 INT 21H RET BIN ENDP CODE ENDS
END START
19. 在附加段有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度。编一个 程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0。 答:DATA SEGMENT
BUFF DB 10, 1,0,2,3,4,0,5,6,7,0 ;10 个数 M EQU 0 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, ES:DATA, DS:DATA START: MOV AX, DATA ; 初始化ES,DS MOV ES, AX MOV DS, AX
MOV AL, M ; 关键字M 存入AL MOV DI, OFFSET BUFF
MOV CL, [DI] ; 数组长度存入CX MOV CH, 0
INC DI ;指向数组起始地址 CLD ;清方向标志
L1: REPNE SCASB ;重复搜索关键字 JNZ STOP ; 未找到,转STOP 结束 JCXZ STOP ; 最后一个数是M,转STOP PUSH DI ;关键字下一单元地址和循 PUSH CX ;环次数入栈保护
DEL: MOV BL, [DI] ; 前移,末尾补0 MOV [DI-1], BL INC DI LOOP DEL
MOV BYTE PTR[DI-1], 0 POP CX ; 恢复CX,DI
POP DI
DEC DI ; 由于REPNE SCASB 已自动加1 JMP L1
STOP: MOV AH, 4CH INT 21H
CODE ENDS END START
20. 编程完成将第二个字符串插入到第一个字符串的指定位置上。