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
相关产品推荐
相关产品推荐

