【发布时间】:2015-11-24 08:53:29
【问题描述】:
我正在编写一个函数,通过内联汇编使用bts 指令设置数字 x 中的第 n 位。这是我的功能:
uint32_t set_bit_assembly(uint32_t x, uint32_t n)
{
asm( "movl %1, %%eax; bts %0, %%eax;"
:"=&r"(x)
:"r"(n)
);
return x;
}
我希望变量 'n' 和 'x' 分别成为 movl 和 bts 的第一个操作数。但是,当我编译时,movl 需要'x' 而完全忽略'n'。 (我尝试交换 %0 和 %1,但没有帮助)。你能告诉我哪里出错了吗?下面是生成的汇编代码:
00000043 <set_bit_assembly>:
43: 55 push %ebp
44: 89 e5 mov %esp,%ebp
46: 83 ec 10 sub $0x10,%esp
49: 8b 55 0c mov 0xc(%ebp),%edx
4c: 89 d0 mov %edx,%eax
4e: 0f ab c0 bts %eax,%eax
51: 89 45 fc mov %eax,-0x4(%ebp)
54: 8b 45 fc mov -0x4(%ebp),%eax
57: c9 leave
58: c3 ret
【问题讨论】:
-
您知道
|运算符,对吗? (如果你想要使用内联汇编,我接受,只是指出你没有有。) -
是的,当然,我知道按位运算符。我只是想在汇编中尝试一些位操作。
-
只是想确认一下。你不会相信有些人的想法。 ;-)
标签: c assembly x86 inline-assembly