Assembly 为什么寄存器$a1总是在Mips体系结构中打印0

Assembly 为什么寄存器$a1总是在Mips体系结构中打印0,assembly,architecture,mips,computer-science,mips32,Assembly,Architecture,Mips,Computer Science,Mips32,在做作业之前,我正在测试一些mips程序集,我试图检查字符串中的字符是否在字母表中。我想出了一个简单的方法让它工作,但我更希望有人能向我解释为什么我的代码每次都打印出一个0 .data str1: .asciiz "allo" str2: .asciiz "a1b2" true: .word 1 false: .word 0 .文本 您正在系统调用的服务($v0=1=print\u integer)只打印$a0中的值。对$a1的任何更改都不会影响结果,因为它与服务无关 有关每个服务的功能及其使

在做作业之前,我正在测试一些mips程序集,我试图检查字符串中的字符是否在字母表中。我想出了一个简单的方法让它工作,但我更希望有人能向我解释为什么我的代码每次都打印出一个0

.data
str1: .asciiz "allo"
str2: .asciiz "a1b2"
true: .word 1
false: .word 0
.文本


您正在系统调用的服务($v0=1=print\u integer)只打印$a0中的值。对$a1的任何更改都不会影响结果,因为它与服务无关


有关每个服务的功能及其使用的参数的更多信息,请参阅:

您能解释syscall 1的功能吗?为什么希望它打印$a1中的值?syscall从内核请求一个服务,所以在本例中,li$v01是调用,这意味着打印一个字节$a0-$a3是过程寄存器,因此它们存储通常用作函数参数的变量,因为我已经使用$a0作为str1的位置,而不是覆盖寄存器地址,虽然我应该使用$a1,但由于某种原因,在我给它返回值1时,它保持返回值0,然后我试图覆盖$a0只是为了查看,它返回了1正确的值,所以我只是想看看是否有人可以解释原因。我是mips的新手,谢谢。您能解释一下您认为系统调用应该如何知道您是要打印$a0还是$a1吗?我被告知,当我调用打印字节li$V01时,它必须在$a0中,因此$a1不能工作。所以syscall调用$a0-$a2,比如$f12等等。。取决于您给寄存器的$v0。因此,使用li$v0 8读取字符串(8是字符串输入)时,字符串使用$a0,最大字符数使用$a1。有许多不同的系统调用可以通过指定的注册表加载Yes,所以请再次考虑prl的最后一个问题。它是汇编编程的主要概念之一,当某些东西不能按预期工作时,首先责怪您的假设,并在调试器中验证哪一个失败,然后与特定指令/服务的文档进行比较。总是怀疑CPU没有读懂你的思想和愿望,因为它确实没有,它总是按照字面上的定义和确定性的方式,所以你可以指望它(双关语)。
main:

    la $a0, str1
    move $t0, $a0

    loop:
        lb $a0, 0($t0)           # pointer on array
        beqz $a0, end            # Checks for end of array
        blt $a0, 97, non_alpha   # Is character in the alphabet
        bgt $a0, 122, non_alpha
        addi $t0, $t0, 1         # Increment pointer
        j loop      

    end:
        li $v0, 1
        lw $a1, true      # !!! This line is the issue, why $a1 print a 0
        syscall           # When I change it to $a0 it prints out 1 as it 
                          # should

        # end program
        li $v0, 10
        syscall

non_alpha: "Did not touch this yet, ignore this"