题目:计算X的N次方,X与N为从键盘读入的十进制数,结果以十六进制输出
源程序:
DATA SEGMENT
STR1 DB 'INPUT X(1~5): ', '$'
STR2 DB 0AH, 0DH, 'INPUT N (1~5): ', '$'
STR3 DB 0AH, 0DH, 'THE RESULT IS: ', '$'
X DB 0
N DB 0
Y DB 4H DUP(0), '$'
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX
CALL INPUT ; 调用输入子程序
MOV AH, 0H
MOV AL, X ; 把X存入AX中
CALL POW ; 调用求N次方子程序
MOV AH, 0H
MOV AL, 0H
CALL OUTPUT ; 调用输出子程序
JMP OVER
INPUT PROC
MOV DX, OFFSET STR1
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 31H ; 判断输入的有效性
JB TO
CMP AL, 35H
JA TO
MOV X, AL
AND X, 0FH
JMP NEXT
TO: JMP OVER ; 跳转中转(JA,JB无法直接跳到OVER处,超出范围了)
NEXT: MOV DX, OFFSET STR2
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 31H
JB OVER
CMP AL, 35H
JA OVER
MOV N, AL
AND N, 0FH
RET ; 函数返回
INPUT ENDP
POW PROC
CMP X, 01H ; 如果X为1,则不管N,结果都为1
JG NEXT1
MOV BX, 01H ; 结果存入BX中
RET
NEXT1: CMP N, 0H ; 递归最简条件,N为0时,结果为1
JG NEXT2
MOV BX, 01H
RET
NEXT2: PUSH AX ; 把AX压入堆栈(暂存X)
DEC N ; N减1
CALL POW ; 调用本身(开始递归)
POP AX ; 弹出AX(弹出暂存的X)
MOV DX, 0H ; DX清0
MUL BX ; BX(存储函数返回结果的寄存器)与AX(暂存寄存器)相乘
MOV BX, AX ; 结果再次保存至BX(递归用)
RET
POW ENDP
OUTPUT PROC
MOV DX, OFFSET STR3
MOV AH, 09H
INT 21H
MOV DI, OFFSET Y
ADD DI, 3 ; 置DI指向Y的高地址(最后一个字节)
MOV AX, BX ; 把BX保存的最终结果复制到AX中一份(暂存)
MOV CL, 4 ; 移位位数
LOP: MOV BH, 0H ; 保留BX最低4位
AND BL, 0FH
CMP BL, 0AH ; 与0A比较,处理ASCII码转换问题
JB NEXT3
ADD BL, 07H
NEXT3: ADD BL, 30H ; 变换成对应的ASCII码
MOV [DI], BL
CMP DI, 0 ; 若DI已经指向Y首地址(全部写入完毕),则跳出
JE NEXT4
DEC DI
MOV BX, AX ; 把暂存的BX取出,重新赋予BX
SHR BX, CL ; 逻辑右移4位,即依次取得4位数据
ADD CL, 4 ; 移位位数依次加4
LOOP LOP
NEXT4: MOV DX, OFFSET Y
MOV AH, 09H
INT 21H
MOV DL, 'H'
MOV AH, 02H
INT 21H
RET
OUTPUT ENDP
OVER: MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
由于考虑到结果的位数问题,只好把X与N的取值缩小的1~5之间,否则如果结果超出了4位十进制数(超出AX的表示位数)的话,我不知道该怎么存储了,不知道这样老师会不会骂我。。。