【发布时间】:2019-08-07 01:42:50
【问题描述】:
我很难理解某些特定的影响 GCC 中用于内联汇编的约束。
在下面的示例中,如果我在输出上使用“=X”并在所有输入上使用“X”运行,则 2 打印输出
0x562f39629260, 100
0x14, 100
这表明指向我分配的缓冲区的指针已更改。导致 Segfault 是尝试读取缓冲区的内容 在我的汇编代码之后。
相反,如果我在输出中输入“+X”或在输入中输入“m”,那么 地址保持不变,打印输出:
0x55571bb83260, 100
0x55571bb83260, 100
而且我可以安全地读取缓冲区而不会出现段错误。
我不明白如何或为什么应该/可以修改此指针? 有没有办法安全地选择约束? gcc 在线文档 对此没有提供太多见解。
非常感谢,
int main() {
long size = 100;
char * buffer = (char*)malloc(size*sizeof(char));
printf("%p, %d\n",buffer, size);
__asm__(
"mov %[out], %%rcx \n"
"mov %[size], %%rbx \n"
"loop: \n"
"movb $1, (%%rcx) \n"
"add $1, %%rcx \n"
"sub $1, %%rbx \n"
"jnz loop \n"
: "=X"(buffer) //outputs
: [out]"X"(buffer), [size]"X"(size) //inputs
: "rbx", "rcx" //clobbers
);
printf("%p, %d\n",buffer, size);
return 0;
}
【问题讨论】:
-
为什么
buffer是一个输出?另外,您到底为什么要使用X约束?当然=X打破buffer...你基本上告诉编译器它应该从它想要的任何地方为buffer获取一个新值,而你甚至没有引用那个参数。
标签: c assembly x86-64 inline-assembly