Visual c++ 如何将装配标记放置到C++;代码(x64) 我需要把标记放在C++代码中,这些代码在汇编或二进制中应该是可见的。使用内联汇编为32位用户完成此操作似乎很简单: __asm { NOP NOP NOP }
或使用DB汇编语句:Visual c++ 如何将装配标记放置到C++;代码(x64) 我需要把标记放在C++代码中,这些代码在汇编或二进制中应该是可见的。使用内联汇编为32位用户完成此操作似乎很简单: __asm { NOP NOP NOP },visual-c++,assembly,visual-studio-2005,64-bit,marker,Visual C++,Assembly,Visual Studio 2005,64 Bit,Marker,或使用DB汇编语句: __asm { DB 0x00, 0xFF, 0x10 } 但是VisualStudio 2005及更高版本不支持x64的内联汇编。有什么办法吗?也许我可以在单独的汇编模块中创建一个函数,但如何确保链接器将实际的汇编放在那里而不是调用?说明可以使用内部函数 //MyAsmCode.asm .code MyFunction proc ... MyFunction endp end 编译它(ml64.exe) 您将获得对象文件(mscoff 64):
__asm {
DB 0x00, 0xFF, 0x10
}
但是VisualStudio 2005及更高版本不支持x64的内联汇编。有什么办法吗?也许我可以在单独的汇编模块中创建一个函数,但如何确保链接器将实际的汇编放在那里而不是调用?说明可以使用内部函数
//MyAsmCode.asm
.code
MyFunction proc
...
MyFunction endp
end
编译它(ml64.exe)
您将获得对象文件(mscoff 64):MyAsmCode.obj
在VS中,将MyAsmCode.obj添加到链接器附加dep
现在您可以调用此函数。;) 在某个地方定义一个全局volatile变量,比如说
volatile\uu int64 blah=0代码>。然后,无论您想要什么标记,都可以使用\u interloctedcompareeexchange64(&blah,some_UNIQUE_CONSTANT1,some_UNIQUE_CONSTANT2)代码>。您将保证找到加载指令的ECX:EBX
带有SOME-UNIQUE-CONSTANT1
和EDX:EAX
带有SOME-UNIQUE-CONSTANT2
后跟LOCK-CMPXCHG8B
(0xF0、0x0F、0xC7等——请参阅指令编码详细信息)。链接器没有放入调用指令,它只是输入实际地址。编译器将对程序集进行调用
。但你为什么需要这个?一个呼叫众所周知的地址不可用作标记吗?是的,可能是这样的:找到标记和它的地址,然后找到这个地址的呼叫。实际上,这是一个很好的解决方案。有一些相关的文章可能会更有帮助地指出\uuu nop
内在:说“另外,优化器可以以不同的方式扩展内在”。我想知道优化器是否可以删除NOP。@激活-优化器可以针对不同的参数以不同的方式扩展内部。像对固定大小的块执行memcpy
比对可变长度的块执行更好。如果您添加\uuuu nop
显然需要它,因此编译器不会删除它。如何确保链接器将内联MyFunction而不是执行调用?请描述您需要它的详细信息,我想我可以帮助您