Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 如何将装配标记放置到C++;代码(x64) 我需要把标记放在C++代码中,这些代码在汇编或二进制中应该是可见的。使用内联汇编为32位用户完成此操作似乎很简单: __asm { NOP NOP NOP }_Visual C++_Assembly_Visual Studio 2005_64 Bit_Marker - Fatal编程技术网

Visual c++ 如何将装配标记放置到C++;代码(x64) 我需要把标记放在C++代码中,这些代码在汇编或二进制中应该是可见的。使用内联汇编为32位用户完成此操作似乎很简单: __asm { NOP NOP NOP }

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):

或使用DB汇编语句:

__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而不是执行调用?请描述您需要它的详细信息,我想我可以帮助您