【问题标题】:Assembly of Powerpc encountered Program received signal SIGSEGV Segmentation fault组装Powerpc遇到程序收到信号SIGSEGV Segmentation fault
【发布时间】:2015-01-10 08:22:22
【问题描述】:

当我尝试将某些内容从寄存器存储到内存时,我收到了分段错误错误。由于我使用gdb逐行调试,当到达stb行时,它会显示Program received signal SIGSEGV。

我试图做的是在 PowerPC Assembly 中实现标准的 C strcat 函数。

这是主要的 C 程序,非常简单。

#include<stdio.h>
extern char *mystrcat(char *first, char *second);
int main(){
  char *first, *second, *third;
  first = "ab";
  second = "cd";
  third = mystrcat(first, second);
  printf("%s\n", third);
  return 0;
}

这是我的 mystrcat.s powerpc 汇编文件。

.text
    .align 2
    .globl mystrcat
mystrcat:
    mr %r5, %r3
.L1:
    lbz %r6, 0(%r5)
    cmpdi %r6, 0
    beq .L2
    addi %r5, %r5, 1
    b .L1
.L2:
    lbz %r6, 0(%r4)
    stb %r6, 0(%r5)
    addi %r4, %r4, 1
    addi %r5, %r5, 1
    cmpdi %r6, 0
    beq .L3
    b .L2
.L3:
    blr

在 L2 标签之前是查找第一个字符串结尾的过程。 Gdb 在 L2 标签后的第二行显示“程序收到信号 SIGSEGV”。 stb %r6, 0(%r5) 命令似乎引发了错误。 但我只是不明白为什么它无法通过 0(%r5) 计算地址。 我尝试过其他命令,看起来像 stbx 或 stbu,但没有一个可以工作。

感谢大家给我一点建议。

更新: 我意识到这与记忆有关。 由于字符串的内存是只读的,有没有办法可以在汇编代码中分配新的内存?我尝试了“bl malloc”和“nop”,但这种行为超出了我的理解。

【问题讨论】:

    标签: c assembly powerpc


    【解决方案1】:

    在您的 main 函数中,您尝试将 2 个字符串与目标字符串连接,而目标字符串没有足够的空间在最后复制源字符串。

    尝试在函数 mystrcat 中添加(某种隐式)内存分配会引起混乱。

    请注意,使用您要模仿的标准 strcat 也会出现分段错误。

    你应该修复你的主要功能,写这样的东西:

    #include <stdio.h>
    
    extern char *mystrcat(char *first, char *second);
    
    int main(){
      char first[8] = "ab";
      char *second, *third;
    
      second = "cd";
      third = mystrcat(first, second);
      printf("%s\n", third);
    
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      字符串文字存储在内存的只读部分。任何修改字符串文字的尝试都会导致未定义的行为

      【讨论】:

        猜你喜欢
        • 2021-01-16
        • 2011-08-16
        • 2021-08-13
        • 1970-01-01
        • 2016-08-19
        • 2012-10-05
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多