如何在C++和Visual Studio 2008中使用asm代码
How to use asm code in C++ & Visual Studio 2008
我正在做一些跨平台的工作,将代码从Linux移植到Win32,但当涉及到一些汇编代码时,我无法使其工作。此代码在Linux gcc中正常编译,但在VS2008-win32中不起作用。
下面是我的一些代码。如果我想使用VS2008--win32平台编译它,我需要做什么:
static inline void spin_wait(int n)
{
int tmp = n;
while(tmp > 0) { tmp--; asm("" ::: "memory", "cc"); }
}
__asm__ __volatile__(
"xorq %%rdx, %%rdx n"
"xorq %%rax, %%rax n"
"incq %%rdx n"
"lock cmpxchgq %%rdx, (%1) n"
"decq %%rax n"
: "=a" (not_set) : "r" (n) : "%rdx");
如果您的问题是关于内联程序集的使用,您仍然可以在Visual Studio(MSDN链接)中使用它,当然您可能需要根据平台对其进行调整。
例如:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
像"spin_wait"这样的东西是不可移植的,应该(重新)写入适合目标平台的内容。我已经有一段时间没有处理过糟糕的GAS语法了,但xorq意味着这个片段是针对x86-64的,对吧?Microsoft编译器不支持64位目标的内联程序集。
_AcquirePinLock可能会起作用吗?
对于较大的汇编块(通常在汇编中编写有意义的部分),我建议您使用带有跨平台汇编程序的外部汇编模块,该汇编程序具有合理的语法和良好的功能集(例如yasm、fasm或nasm)。当然,对于这样关键的东西来说,这是不可行的,并且必须作为spinlock内联,不过:)
相关文章:
- objdump 不显示机器代码,但显示 ASM
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- C++ Lambda 生成的 ASM 代码
- 为什么godbolt生成的asm输出与我在Visual Studio中的实际asm代码不同
- 这个 asm 代码的意义是什么?
- 将 GCC 特定的 ASM 代码移植到 MSVC
- 代码编译器-如何编译ASM代码
- 将浮点数组转换为整数的最佳方式.[替换x64的asm代码]
- 从 Win16 移植到 Win32 - ASM 代码块混淆
- 未定义的行为是否适用于 asm 代码
- 是否有可靠的工具可以删除ASM/C/C++代码中的注释
- 如何在C++和Visual Studio 2008中使用asm代码
- 在gcc中生成ASM代码需要什么,g++
- ASM代码中对c++变量的未定义引用
- 正在尝试理解ASM代码
- 有人能帮助将此asm代码转换为x64版的c++吗
- 用asm代码在C++中交换2个变量
- 使用libtool和autoconf构建ASM代码
- 将十六进制代码格式化为asm代码
- 在c++中使用asm代码操作寄存器时会发生什么?