2013-10-14 42 views
0

打印字符串下面我有MIPS:没有pseduo说明

.globl main 
.data 
prompt: 
     .asciiz "Hello world!" 
.text 
main: 
    addi $v0, $v0, 4 
    lui $a0, 0x1000 
    syscall 
rtn: 
    jr $ra 

现在,我不知道为什么字符串不打印,它运行没有语法错误。另外,我不允许使用任何伪指令,所以这就是为什么我要以更长的方式来做这件事。这是错误进入的地方,我不知道提示字符串存储在哪里?任何帮助表示赞赏!

谢谢!

+0

是什么让你觉得'prompt'位于地址'0x1000'? –

+0

在例子中,我们在课堂上给出了他,他会创建一个他没有定义在任何给定地址开始的数组。然后他创建了一个字符串并将其称为提示。当他想要使用提示符时,他将10加到0x1000以获得阵列中的第一个索引(数组长度为10个字节)。接下来的事情是提示,这是一个0 + 10. – user2864709

+0

好的 - 即使它是正确的地址,你应该养成使用符号地址而不是硬编码的习惯。 –

回答

1

在SPIM中,.data部分默认从地址0x10010000开始。因此,要打印Hello World字符串而不使用伪指令,您可以使用:

.globl main 
.data 
prompt: 
    .asciiz "Hello world!" 
.text 
main: 
    addi $v0, $zero, 4 
    lui $a0, 0x1001  # $a0 = 0x10010000 
    syscall 
rtn: 
    jr $ra 
+0

谢谢,这清除了事情! – user2864709

1

请注意,如果地址是0x1000,则表示高16位全为零,最低16位为0x1000。您正在加载高16位。因此,而不是lui $a0, 0x1000尝试addiu $a0, $0, 0x1000

然而,你的汇编的符号操纵表情不应该算作伪指令,所以像这种气体代码(或在你的汇编的等价物)也应该被允许:

lui $a0, %hi(prompt) 
ori $a0, $a0, %lo(prompt)