gpt4 book ai didi

c++ - 如何用 'asm volatile'写btr指令

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:20 26 4
gpt4 key购买 nike

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

这是我的实现,这对于 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 程序集。

最佳答案

这是一个用适当的读写操作数替换 memory clobber 的版本,而不是在寄存器中传递地址,并且还去掉了 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;
}

关于c++ - 如何用 'asm volatile'写btr指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52067307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com