使用 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