汇编作业(2006.5.10)

题目:计算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的表示位数)的话,我不知道该怎么存储了,不知道这样老师会不会骂我。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值