gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:07 25 4
gpt4 key购买 nike

当我尝试将某些内容从寄存器存储到内存时,我收到了段错误。我用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 标签后的第二行显示“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;
}

关于c - Powerpc 的组装遇到 Program received signal SIGSEGV Segmentation fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27874260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com