使用 asm 函数修改 C 结构中分配的字符串时出错
Error while modifying mallocated string in a C struct with asm function
我想用 asm 函数修改 C 结构中的字符串,但它不能正常工作...
假设我在 64 位架构上有这种类型的结构:
typedef struct my_struct
{
char letter1;
char letter2;
char *string;
}my_struct;
由于结构填充,sizeof(my_struct) 应该是 16 因为 :
typedef struct my_struct
{
char letter1; // 1 byte
char letter2; // 1 byte
//6 bytes of padding
char *string; // 8 bytes
}my_struct;
所以,如果我调用这个 asm 函数:
void string_change(my_struct *s);
我可以更改例如结构字符串的第一个字母:
mov byte [rdi+8],'x'
但它不起作用...你能帮我吗?
非常感谢。
这是我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct my_struct
{
char letter1;
char letter2;
char *string;
}my_struct;
void string_change(my_struct *s);
int main(void)
{
my_struct s;
s.string = malloc(sizeof(char)*8);
strcpy(s.string,"bonjour");
printf("before call : s.string = %s\n",s.string);
string_change(&s);
printf("after call : s.string = %s\n",s.string);
free(s.string);
return 0;
}
这是我的汇编代码:
bits 64
global string_change
section .text
string_change:
mov byte [rdi+8],'x';
ret
跟进 Peter Cordes 的评论:
string_change: ;rdi = ptr to structure
mov rdi,[rdi+8] ;rdi = ptr to string
mov byte [rdi],'x' ;change first character of string
ret
我想用 asm 函数修改 C 结构中的字符串,但它不能正常工作...
假设我在 64 位架构上有这种类型的结构:
typedef struct my_struct
{
char letter1;
char letter2;
char *string;
}my_struct;
由于结构填充,sizeof(my_struct) 应该是 16 因为 :
typedef struct my_struct
{
char letter1; // 1 byte
char letter2; // 1 byte
//6 bytes of padding
char *string; // 8 bytes
}my_struct;
所以,如果我调用这个 asm 函数:
void string_change(my_struct *s);
我可以更改例如结构字符串的第一个字母:
mov byte [rdi+8],'x'
但它不起作用...你能帮我吗? 非常感谢。
这是我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct my_struct
{
char letter1;
char letter2;
char *string;
}my_struct;
void string_change(my_struct *s);
int main(void)
{
my_struct s;
s.string = malloc(sizeof(char)*8);
strcpy(s.string,"bonjour");
printf("before call : s.string = %s\n",s.string);
string_change(&s);
printf("after call : s.string = %s\n",s.string);
free(s.string);
return 0;
}
这是我的汇编代码:
bits 64
global string_change
section .text
string_change:
mov byte [rdi+8],'x';
ret
跟进 Peter Cordes 的评论:
string_change: ;rdi = ptr to structure
mov rdi,[rdi+8] ;rdi = ptr to string
mov byte [rdi],'x' ;change first character of string
ret