MIPS将字节(sb)存储到字符串中会产生分段错误

时间:2015-04-02 00:15:00

标签: c assembly mips

基本上,我试图使用sb将char(1个字节)存储到内存中。

我正在编写MIPS程序集以重现某些C代码的功能。我将函数str_make_lower放在一个单独的文件中,并用它编译C代码。

#include <stdio.h>
/* uses tolower() to convert upper case to lower case*/
void str_make_lower(char *s);
//  while(*s != '\0'){
//      *s = tolower(*s);
//      s++;
//  }
// }


int main(int argc, char const *argv[])
{
    char *s = "AB\000";
    str_make_lower(s);
    printf("%s\n", s);
    return 0;
}

我的程序集如下,它应该模仿注释掉的C代码:

.text
.global str_make_lower
str_make_lower:
    # arg passed in:
    # a0: char *s
    addi    $sp, $sp, -40
    sw      $ra, 32($sp)
    sw      $s0, 36($sp)

    # save char *s 
    move    $s0, $a0

while_str_make_lower:
    # initialize registers
    add     $t0, $zero, $zero
    add     $a0, $zero, $zero

    lb      $t0, 0($s0)     # get a char from pointer
    beq     $t0, $zero, str_make_lower_return
    nop

    move    $a0, $t0        # load arg for tolower

    jal     tolower         # yeah
    nop

    add     $t0, $zero, $zero
    move    $t0, $v0        # collect lower letter
    sb      $t0, 0($s0)     # store it back

    addiu   $s0, $s0, 1     # increment pointer
    j       while_str_make_lower
    nop

str_make_lower_return:
    # restore and return
    lw      $s0, 36($sp)
    lw      $ra, 32($sp)
    addi    $sp, $sp, 40
    jr      $ra
    nop

最终,通过使用gdb,我发现存储字节(sb)给出了seg错误。我检查了$t0$s0的内容,但两者的价值似乎应该是它们应该是的。我想知道我是否使用了sb错误或其他错误。

(gdb) p $t0
$5 = 97
Program received signal SIGSEGV, Segmentation fault.
while_str_make_lower () at tl.s:35
35      sb      $t0, 0($s0)     # store it back
(gdb) bt
#0  while_str_make_lower () at tl.s:35
#1  0x00400700 in while_str_make_lower () at tl.s:30
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

(gdb) p (char*)$s0
$9 = 0x4008c0 "AB"

谢谢!

0 个答案:

没有答案