如何使用"asm volatile"编写 btr 指令
How to write the btr instruction with 'asm volatile'
使用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 程序集不是很熟悉。
这是一个版本,它用适当的读写操作数替换了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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- C++CMake编译指令与
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- AVX 指令中寄存器和指针之间的客观差异
- while 循环 c++ 中的非法指令
- 如何在编译时定义C++预处理器指令的值?
- 存储指令是否会阻止缓存未命中的后续指令?
- 保证编译器指令在C++中重新排序
- VS2008中的AVX-512指令库
- 令人困惑的定义指令在C ++项目中
- 如何使用"asm volatile"编写 btr 指令