如何使用"asm volatile"编写 btr 指令



使用btr重置整数中的位的正确实现是什么,C++扩展程序集(asm volatile(语法? 我需要在重置之前返回位中的值。

这是我的实现,这对于 16 位整数是否正确?

std::uint16_t reset(std::uint16_t& integer, std::uint32_t bit) {
auto success = false;
asm volatile("lock btrw %1, (%2); setnc %0"
: "=r"(success)
: "i"(bit), "r"(&integer)
: "memory", "flags");
return !success;
}

此实现是否正确? 我错过了任何细节吗? 我对asm()语法或 x86 程序集不是很熟悉。

这是一个版本,它用适当的读写操作数替换了memoryclobber,而不是在寄存器中传入地址,并且还摆脱了setnc(需要 gcc 6+(。添加了r以涵盖编译时bit未知的情况。success更改为具有bool类型的更具可读性的was_set。请注意,如果您希望它是原子的,您还需要添加一个lock前缀。对于编译器内存屏障,您可能需要将memory约束放回原处。

bool reset(std::uint16_t& integer, std::uint32_t bit) {
bool was_set;
asm volatile("btrw %w2, %1"
: "=@ccc"(was_set), "+mr"(integer)
: "ri"(bit)
: "cc");
return was_set;
}

原子版本可能如下所示:

bool reset(std::uint16_t& integer, std::uint32_t bit) {
bool was_set;
asm volatile("lock btrw %w2, %1"
: "=@ccc"(was_set), "+m"(integer)
: "ri"(bit)
: "cc", "memory");
return was_set;
}

最新更新