Powerpc 的组装遇到 Program received signal SIGSEGV Segmentation fault

Assembly of Powerpc encountered Program received signal SIGSEGV Segmentation fault

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

我尝试做的是在 PowerPC 汇编中实现标准的 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 标签后的第二行 "Program received signal SIGSEGV"。 stb %r6, 0(%r5) 命令似乎引发了错误。 但我只是不明白为什么它不能通过 0(%r5) 计算出地址。 我试过其他命令,看起来像 stbx 或 stbu,但没有一个有效。

谢谢大家给我一点小建议

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

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

在您的 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;
}