【问题标题】:Assembly MIPS: Printing a character five times using loops汇编 MIPS:使用循环打印一个字符五次
【发布时间】:2016-10-31 10:14:02
【问题描述】:

我想编写一个使用循环打印星号字符'*'五次的程序,所以我写了这个:

.data
ast: .word '*'

.text
.globl main
main:
la  $a0, ast
add $t0, $zero, $zero   #counter

loop:

slti    $t1, $t0, 5
beq     $t1, $zero, exit

li  $v0, 1
syscall

addiu   $t0, $t0, 1

j loop
exit:

li  $v0, 10
syscall

但不是打印五个星号,而是给我这个巨大的数字: 268500992268500992268500992268500992268500992

通过逐步运行,我看到我用于计数器的 $t0 对每个循环都有正确的值(1 到 2 到 3 到 4 到 5)。 使用 slti 和 beq 线,我尝试控制循环,直到计数器达到数字 5。

缺少什么?

【问题讨论】:

  • 可能是syscall。 “巨大的数字”实际上是268500992打印了5次。抱歉,我不知道系统调用。
  • 当您应该使用系统调用 #11(打印字符)时,您正在使用系统调用 #1(打印整数)。见:courses.missouristate.edu/KenVollmar/MARS/Help/SyscallHelp.html
  • 十六进制数字是10010000,所以我会试一试,猜你打印的是标签地址,而不是那里的星号字符。
  • @PaulR 我把它改成了 11 但它什么也没打印
  • @WeatherVane 我如何打印星号?

标签: assembly mips


【解决方案1】:

您的代码存在两个问题。首先,在数据声明中,星号应标为 .asciiz 而不是 .word。 .word 数据类型通常用于整数,因为它是 32 位长。 其次,您使用了错误的系统调用来打印 aesterick。 li $v0, 1 用于打印整数。这里要使用的正确的是 li $v0, 4。

.data
ast: .asciiz "*"

.text
.globl main
main:
la  $a0, ast
add $t0, $zero, $zero   #counter

loop:

slti    $t1, $t0, 5
beq     $t1, $zero, exit

li  $v0, 4
syscall

addiu   $t0, $t0, 1

j loop
exit:
li  $v0, 10
syscall

上面的代码打印出 5 *.希望这有帮助。干杯!

【讨论】:

  • 有趣的事实:.word '*' 不寻常,但实际上等同于 .asciiz "*" / .byte 0,0(即 2 个额外的零字节)。此外,更好的是使用 v0=11 print_char 系统调用和li $a0, '*',或者编写一个循环将星号存储到一个打印字符串系统调用的缓冲区中,就像在this question 中关于打印多行星号一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多