2017-04-14 169 views
0

我正在用bison构建一个编译器并遇到这个问题。 我需要动态分配内存并存储字符串,然后打印它的内容。Mips动态内存分配和指针

我考虑过在数据部分保存一个指针,然后分配内存保存指针中的地址,然后分配字符串val然后打印它。 我的问题是当我试图打印字符串时,它只打印第一个字符。 这里是一个代码示例。

.data 
    p: .word 0 # pointer to save the allocated memory first address. 
.text 

    li $v0,9 #allocate instruction 
    li $a0,64 # allocate 64 byte 
    syscall 
    sw $v0,p #save the first memory address to pointer p 

    li $t0,'a' #write the first byte 'a' cahr 
    sw $t0,0($v0) 
    li $t0,'b' #write the first byte 'a' cahr 
    sw $t0,4($v0) 

    li $v0,4 #print instruction 
    lw $a0,p 
    syscall 

这将导致火星在火星控制台上。 有什么想法为什么?

+0

尝试使用'.align',因为您使用的是与'char'不匹配的'word' – Adam

回答

0

我只是猜测:但字符通常是以字节存储。因此b应该在1($ v0)而不是4($ v0)中,你需要在2中有一个空值来终止。

0

Andrew感谢您的提示,它的工作。 问题是系统调用4正在逐字节地读取数据,因此我在每个填充了null的字词之间加载单词,因此它只打印第一个字节,然后停止。 解决方案是使用sb(存储字节)指令并将偏移量增加1. 感谢您的帮助。