为什么加载地址对带有字符串的单词和标签的作用不同?

Why load address works different on words and labels with strings?

嗨,

我刚刚有一个简短的问题。假设我有 2 个标签 string 和 word,其中 string 是与字符串关联的标签,而 word 是实际单词,其中存储了 32 位整数。现在假设我使用系统调用来使用标签字符串打印字符串,我使用寄存器 a0 加载地址,它将打印字符串。但是为什么它不打印地址,因为这是加载地址。另一方面,如果我做完全相同的事情,但不是使用字符串标签,而是使用单词标签,我现在将打印实际地址。我想知道为什么它会这样工作。

感谢您的宝贵时间

Varun G.

我认为您误解了系统调用。你发出一个特定的系统调用来做不同的事情。

要打印字符串,您需要输入 syscall 4 ($v0 = 4)。此服务打印由 $a0 中给出的地址指向的字符串,您应该先加载它。

要打印一个整数,您需要输入 syscall 1 ($v0 = 1)。此服务打印存储在 $a0 的整数。如果您使用 la 伪指令加载该整数,则该整数可能被视为一个地址。

因此,如果您有以下代码段:

.data
str: .asciiz "hello!"

.text
  la $a0, str
  li $v0, 1
  syscall  # This will print the starting address of the string
  li $v0, 4
  syscall  # This will print the contents of the string pointed by label str

它将打印字符串开头的地址及其内容。