gpt4 book ai didi

c - 从程序集访问 C 指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:31 26 4
gpt4 key购买 nike

我目前正在学习如何将 C 代码与汇编代码混合使用。在 .c 文件中,我有以下代码:

extern int replace(char *c);
int main(){
static char * string2 = "aaab\n";
static char * string3;
string3 = (char *) replace(string2);
*string3 = 'A';
printf("%s",string3);
}

汇编函数replace的代码如下:

section .data
string db "Test",10,0
section .text
global replace
replace:
enter 0,0
mov eax, string
leave
ret

这工作得很好,表明 C 程序可以访问 .asm 文件内存。但是,当我尝试写入指针 string2 时,比如将以下代码添加到函数 replace 中,

mov edx, [ebp + 8]
mov byte [edx], 10

我得到一个段错误。 (根据我的理解,后者将指针的地址传递给 edx,因此 edx = string2,然后通过 *edx = 10 分配 *string2 = 10)。你能解释一下我做错了什么吗?

编辑:我发现当我执行 string3 = (char *) malloc(10);那么我确实可以在汇编中做

mov edx, [ebp + 8]
move byte [edx], 10

并得到正确的结果。如果能解释为什么会这样,我将不胜感激。这是因为堆可以公开访问吗?可能是因为之前 char *string = "Hi"指向存储字符串的内存的只读部分?我正在自己学习这个,所以我将不胜感激。

最佳答案

您的 C 程序中的问题是由于创建了一个无法修改的字符串文字:

static char *string2 = "aaab\n";

您通过替换调用将指针 string3 分配给 string2 的地址:

string3 = (char *) replace(string2);

然后您尝试通过将第一个字符从 a 更改为 A 来修改只读存储器 (string2):

*string3 = 'A';

这会导致段错误。要修复段错误,只需将 string2 声明更改为:

static char string2[] = "aaab\n";

所以它只是一个字符数组而不是字符串文字。

当您使用 char *label = "stuff"; 创建一个文字时,您在只读内存中创建了一个文字。通过使用 gcc -S -masm=intel -o file.asm file.c 转储 C 程序的程序集,您可以自己轻松地看到这一点。如果您查看,您会看到 "aaab\n" 是在 .rodata(只读)数据部分中创建的:

    .section        .rodata
.string "aaab\n"
.data
.align 8

关于c - 从程序集访问 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31307546/

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