无法理解MIPS汇编指令的一小部分内容

时间:2017-02-11 12:29:40

标签: assembly mips

该程序打印从0到Z的ASCII字符。输出为

0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

问题是如何更改程序,以便打印每三个ASCII字符。因此输出必须如下所示

0369<?BEHKNQTWZ]

当我将addi $s0,$s0,1中的常量更改为addi $s0,$s0,3时 输出是很多ASCII字符,它就像一个无限循环。

.text


main:
          li    $s0,0x30


loop:
         move   $a0,$s0     

         li $v0,11      
         syscall            

         addi   $s0,$s0,1       # what happens if the constant is changed?

          li    $t0,0x5b
         bne    $s0,$t0,loop
         nop


stop:    j       stop       
         nop    

当我改变那个常数时,我不明白为什么程序会变得疯狂的原因。

我编写了自己的代码,如下所示,工作正常,但是我想了解上面的代码,因为它是一项任务。

 .data



 .text

        main:
              li $s0,0x30



       for: 
             addi $a0,$s0,0
             li $v0,11
             syscall
             li $t0,0x5a
             bgt $s0,$t0, done
             addi $s0,$s0,3
             j for
       done:            

1 个答案:

答案 0 :(得分:1)

此打印的字符数(43)不能被3整除,因此每次加3,您的循环将超过其退出条件(s0 == t0)。尝试将bne更改为blt

你自己的代码完全相同,只是当它超过终点时跳出循环,而不是回到顶部,除非它有