【发布时间】: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”,但这种行为超出了我的理解。
【问题讨论】: