8086汇编语言3位数阿姆斯特朗数实现问题求助
8086汇编实现3位数阿姆斯特朗数判断解决方案
要解决3位数阿姆斯特朗数判断问题,你需要补全两个核心逻辑:正确读取多位输入并转换为数值,以及拆分各位计算立方和。以下是修正后的完整代码及关键步骤说明:
.MODEL SMALL .STACK 100H .DATA PROMPT DB 'Enter a 3-digit number: $' ARMSTRONG_MSG DB 10,13,'It is an Armstrong number.$' NOT_ARMSTRONG_MSG DB 10,13,'It is NOT an Armstrong number.$' ; 输入缓冲区:最多接收3位数字+回车+结束符,共4字节空间 INPUT_BUFFER DB 4 DB ? ; 实际输入字符数 DB 4 DUP(?) .CODE MAIN PROC ; 初始化数据段 MOV AX, @DATA MOV DS, AX ; 显示输入提示 LEA DX, PROMPT MOV AH, 09H INT 21H ; 读取用户输入字符串 LEA DX, INPUT_BUFFER MOV AH, 0AH INT 21H ; 将ASCII字符串转换为十进制数值 MOV CL, INPUT_BUFFER+1 ; 获取实际输入的字符长度 MOV SI, OFFSET INPUT_BUFFER+2 ; 指向输入的第一个字符 XOR AX, AX ; AX用于存储转换后的数值 MOV BX, 10 ; 基数10 CONVERT: MUL BX ; AX = AX * 10,为下一位数字腾出位置 MOV DL, [SI] SUB DL, '0' ; ASCII字符转数字 ADD AL, DL ; 累加当前位数字 INC SI ; 移动到下一个字符 DEC CL JNZ CONVERT ; 直到所有字符处理完 MOV CX, AX ; 保存原数到CX,用于后续比较 ; 拆分各位并计算立方和 XOR BX, BX ; BX存储立方和,初始化为0 MOV AX, CX ; 把原数加载到AX MOV DL, 10 ; 除数10 ; 计算个位的立方 XOR AH, AH DIV DL ; AL = 原数/10,AH = 个位数字 PUSH AX ; 保存商,用于后续处理十位和百位 MOV AL, AH MUL AH ; AL = 个位^2 MUL AH ; AL = 个位^3 ADD BX, AX ; 累加到立方和 ; 计算十位的立方 POP AX ; 取出之前的商(原数/10) XOR AH, AH DIV DL ; AL = 原数/100,AH = 十位数字 PUSH AX MOV AL, AH MUL AH MUL AH ADD BX, AX ; 计算百位的立方 POP AX ; AL就是百位数字 MUL AL MUL AL ADD BX, AX ; 比较立方和与原数 CMP BX, CX JE PRINT_ARMSTRONG ; 输出非阿姆斯特朗数提示 LEA DX, NOT_ARMSTRONG_MSG MOV AH, 09H INT 21H JMP EXIT_PROG PRINT_ARMSTRONG: ; 输出阿姆斯特朗数提示 LEA DX, ARMSTRONG_MSG MOV AH, 09H INT 21H EXIT_PROG: ; 程序退出 MOV AH, 4CH INT 21H MAIN ENDP END MAIN
关键逻辑说明
- 多位输入读取:使用
INT 21H的0AH功能,通过输入缓冲区接收用户输入的字符串,解决单字符读取的局限性。 - ASCII转数值:遍历输入字符,减去
'0'将ASCII码转为数字,再通过MUL 10累加得到完整十进制数。 - 拆分各位:通过
DIV 10指令拆分个位、十位、百位——第一次DIV得到个位余数,商再DIV得到十位余数,最终商即为百位。 - 立方计算:对每个位执行三次
MUL指令得到立方值,累加到总和后与原数比较。 - 结果判断:比较立方和与原数,相等则输出阿姆斯特朗数提示,否则输出否定结果。
注意事项
- 代码限制输入为3位数,若需支持任意位数,需调整输入缓冲区大小并改为循环取余的拆分逻辑(直到商为0)。
- 确保汇编环境支持
SMALL模型,栈大小设置足够处理运算过程。
内容的提问来源于stack exchange,提问作者i22-0627 Ali Raza Khan
相关产品推荐
相关产品推荐

