You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:47:05