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

MIPS汇编开发:将输入整数的数字转换为英文单词输出

嘿,我来帮你补全并梳理这段MIPS汇编代码,实现把输入整数的每一位转换成对应英文单词输出的功能。先明确核心需求:输入一个非负整数(比如123),程序要输出One Two Three这样的结果;若输入负数则判定为无效。


.data 段定义(完整版)

.data
arr: .space 40          # 存储0-9对应英文单词的地址数组,每个地址占4字节,共10个元素
Zero: .asciiz "Zero"
One: .asciiz "One"
Two: .asciiz "Two"
Three: .asciiz "Three"
Four: .asciiz "Four"
Five: .asciiz "Five"
Six: .asciiz "Six"
Seven: .asciiz "Seven"
Eight: .asciiz "Eight"
Nine: .asciiz "Nine"
prompt: .asciiz "Enter a number:"
End: .asciiz "\n End of program"
Invalid:.asciiz "\n Invalid Entry"

.text 段完整实现(含注释)

.text
.globl main
main:
    # 第一步:把0-9对应的英文单词地址存入arr数组
    la $a1, arr
    la $s0, Zero
    sw $s0, 0($a1)       # arr[0] = Zero的地址
    la $s0, One
    sw $s0, 4($a1)       # arr[1] = One的地址
    la $s0, Two
    sw $s0, 8($a1)       # arr[2] = Two的地址
    la $s0, Three
    sw $s0, 12($a1)      # arr[3] = Three的地址
    la $s0, Four
    sw $s0, 16($a1)      # arr[4] = Four的地址
    la $s0, Five
    sw $s0, 20($a1)      # arr[5] = Five的地址
    la $s0, Six
    sw $s0, 24($a1)      # arr[6] = Six的地址
    la $s0, Seven
    sw $s0, 28($a1)      # arr[7] = Seven的地址
    la $s0, Eight
    sw $s0, 32($a1)      # arr[8] = Eight的地址
    la $s0, Nine
    sw $s0, 36($a1)      # arr[9] = Nine的地址

    # 第二步:提示用户输入数字并读取输入
    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall
    move $s1, $v0        # $s1存储输入的整数

    # 检查输入是否为负数(负数视为无效输入)
    bltz $s1, invalid_input

    # 特殊情况:输入为0时直接输出Zero
    beq $s1, $zero, print_zero

    # 第三步:提取每一位数字(用栈反转顺序,确保从高位到低位输出)
    li $sp, 0x7ffffffc   # 初始化栈指针(MIPS栈从高地址向下增长)
extract_digits:
    beq $s1, $zero, print_digits
    li $t0, 10
    div $s1, $t0         # $s1 / 10,余数在$hi,商在$lo
    mfhi $t1             # $t1 = 当前提取的个位数字
    mflo $s1             # $s1 = 商,继续处理剩余高位
    addi $sp, $sp, -4    # 栈指针下移,准备存储数字
    sw $t1, 0($sp)       # 把当前数字压入栈
    j extract_digits

print_zero:
    # 输出Zero
    li $v0, 4
    la $a0, Zero
    syscall
    j end_program

print_digits:
    beq $sp, 0x7ffffffc, end_program  # 栈空则结束输出
    lw $t1, 0($sp)       # 弹出栈顶的数字(此时是高位到低位顺序)
    addi $sp, $sp, 4     # 栈指针上移

    # 计算该数字对应单词的地址:arr + 数字*4(每个地址占4字节)
    sll $t2, $t1, 2      # 等价于 t1 * 4
    add $t3, $a1, $t2
    lw $a0, 0($t3)       # 获取对应英文单词的地址

    # 输出单词
    li $v0, 4
    syscall

    # 非最后一个单词时输出空格分隔
    bne $sp, 0x7ffffffc, print_space
    j print_digits

print_space:
    li $v0, 11
    li $a0, ' '
    syscall
    j print_digits

invalid_input:
    li $v0, 4
    la $a0, Invalid
    syscall
    j end_program

end_program:
    li $v0, 4
    la $a0, End
    syscall
    li $v0, 10           # 退出程序
    syscall

关键逻辑说明

  • 数组映射:arr数组专门存储0-9每个数字对应的英文单词字符串地址,通过数字*4的偏移量快速定位对应单词。
  • 输入校验:简单判定负数为无效输入,符合常规非负整数转换场景;输入0时单独处理,避免进入循环提取逻辑。
  • 栈反转顺序:通过除以10取余的方式提取数字时,得到的是从个位到高位的顺序,用栈存储后再弹出,就能实现从高位到低位的输出。
  • 分隔处理:每输出一个单词后,判断栈是否为空,非空则输出空格,避免末尾多一个空格。

内容的提问来源于stack exchange,提问作者TFG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:27:10