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;
}
当我尝试将某些内容从寄存器存储到内存时,我收到了分段错误。我用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;
}