如何在 c x86 AT&T 内联汇编中访问和更改 char 数组
how to access and change char array in c x86 AT&T inline assembly
我在解决学校练习时遇到问题,我应该使用内联汇编更改 c 中的 char 数组。在这种情况下,将 "ahoy" 更改为 "aXoy",但出现分段错误。这是我的代码:
#include <stdio.h>
int main() {
char string[] = "ahoy";
__asm__ volatile (
"mov %0, %%eax;"
"movb $'X', 1(%%eax);"
: "=m"(string) : "0"(string) : "memory", "eax");
printf("%s\n", string);
return 0
}
这样:"mov %0, %%eax;"
我正在尝试将数组的地址存储在寄存器中
然后这样:"movb $'X', 1(%%eax);"
我想将字节 'X' 存储在 (%%eax) 指向的位置偏移 1 个字节 (char),
我有字符串作为输出和输入,"memory","eax" 在 clobber 中,因为我正在修改两者。我的代码有什么问题?
使用gcc -S
而不是-c
来查看编译器的汇编输出,您应该可以看出哪里出了问题。 "m"
约束生成一个内存引用表达式,用于访问与其关联的对象,而不是包含其地址的寄存器。所以它将扩展为 (%ecx)
,而不是 %ecx
,第一个 mov
将从 string
加载 4 个字节,而不是 string
的地址,进入 eax
.
解决此问题的一种方法是改用寄存器约束 "r"(string)
。
或者您可以将 mov
替换为 lea
:lea %0, %%eax
.
您的代码还有其他问题,例如无用的 temporary/clobber 寄存器 eax
,但它们不应该阻止它工作。
我在解决学校练习时遇到问题,我应该使用内联汇编更改 c 中的 char 数组。在这种情况下,将 "ahoy" 更改为 "aXoy",但出现分段错误。这是我的代码:
#include <stdio.h>
int main() {
char string[] = "ahoy";
__asm__ volatile (
"mov %0, %%eax;"
"movb $'X', 1(%%eax);"
: "=m"(string) : "0"(string) : "memory", "eax");
printf("%s\n", string);
return 0
}
这样:"mov %0, %%eax;"
我正在尝试将数组的地址存储在寄存器中
然后这样:"movb $'X', 1(%%eax);"
我想将字节 'X' 存储在 (%%eax) 指向的位置偏移 1 个字节 (char),
我有字符串作为输出和输入,"memory","eax" 在 clobber 中,因为我正在修改两者。我的代码有什么问题?
使用gcc -S
而不是-c
来查看编译器的汇编输出,您应该可以看出哪里出了问题。 "m"
约束生成一个内存引用表达式,用于访问与其关联的对象,而不是包含其地址的寄存器。所以它将扩展为 (%ecx)
,而不是 %ecx
,第一个 mov
将从 string
加载 4 个字节,而不是 string
的地址,进入 eax
.
解决此问题的一种方法是改用寄存器约束 "r"(string)
。
或者您可以将 mov
替换为 lea
:lea %0, %%eax
.
您的代码还有其他问题,例如无用的 temporary/clobber 寄存器 eax
,但它们不应该阻止它工作。