【发布时间】:2012-11-12 20:20:34
【问题描述】:
我想在汇编中增加一个 TLS 变量,但在汇编代码中给出了分段错误。我不想让编译器更改任何其他寄存器或内存。有没有办法在不使用 gcc 输入和输出语法的情况下做到这一点?
__thread unsigned val;
int main() {
val = 0;
asm("incl %gs:val");
return 0;
}
【问题讨论】:
-
1) 为什么你不能写成'
val += 1;'呢? 2) 写那个,用-O2 -S编译它,然后检查汇编输出;你会发现你搞错了如何访问__thread变量。 -
@Zack 你能写一个关于这个的答案吗?
-
val++ 转换为 movl $0x1,%gs:0xfffffffc,但是当我手动执行 asm("movl $1, %gs:val") 时,它会转换为 movl $0x1,%gs:0x8049f14。如何在我的程序中获取地址 0xfffffffc。
-
@user1428099 你应该查看
gcc -S输出来了解你需要写什么,而不是objdump -d输出。但实际上你应该按照我刚才在回答中描述的那样去做。