MIPS:打印没有伪指令的字符串

时间:2013-10-14 15:53:05

标签: string assembly mips cpu-registers

下面我有

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

现在,我不确定为什么字符串不打印,它运行时没有语法错误。此外,我不允许使用任何伪指令,所以这就是为什么我这样做的时间稍长。那是错误的来源,我不知道提示字符串存储在哪里?任何帮助表示赞赏!

谢谢!

2 个答案:

答案 0 :(得分:1)

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

但是,汇编程序的符号操作表达式不应该算作伪指令,所以也应该允许这样的GAS代码(或汇编程序中的等价代码):

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

答案 1 :(得分: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