是否有工具可用于'assemble'WebAssembly到x86-64本地代码?
我猜想一个wASM二进制通常被jit汇编为本机代码,但是给定wasm源,是否有工具可以查看实际生成的x86-64机器代码? 或以不同的方式询问,是否有一种工具可以消耗WASM并输出本机代码? 解决方案 在线 wasmexplorer 使用webAssembly和firefox x86编译C代码Spidermonkey编译器.给定以下简单功能: int testFunction(int* input, int length) { int sum = 0; for (int i = 0; i
0 2023-11-29
编程技术问答社区
用Visual Studio Express 2013进行64位编译
我必须编译一个C ++项目并将其运行为64位应用程序,以避免32位内存限制. 我的IDE是Visual Studio 2013 Express for Windows桌面 我找不到有关如何执行此操作的明确答案,任何人都有解决方案? 解决方案 从命令行,加载交叉编译器: call %VSDIR%\VC\vcvarsall.bat x86_amd64 打开解决方案 %VSDIR%\Common7\IDE\WDExpress.exe solution.sln 就是这样. x86_amd64切换到编译器(恰好是32位程序),该编译器会产生64位代码指令.因此,编译器本身与2GO内存绑定,但是结果程序没有此限制.
0 2023-11-24
编程技术问答社区
错误LNK2019:函数main中引用了未解决的外部符号
试图以C ++运行我的简单汇编代码.我只有两个文件" .cpp"文件和" .ASM"文件.编译时会出现错误(请参阅下文).如果有人可以帮助...:) ,我将不胜感激. 这是我的" main.cpp"文件 #include using namespace std; extern "C" int GetValueFromASM(); int main(int argc, char *argv[]){ coutmain.obj : error LNK2019: unresol
0 2023-11-23
编程技术问答社区
Visual Studio 2010中的编程数据断点
我一直在尝试使用程序化数据断点, CBreakpoint 示例,通过使用 SetThreadContext 直接注册.我可以找到的大多数参考文献表明,即使没有设置数据断点本身,Visual Studio仍会在遇到数据断点时仍会破裂.但是,这似乎不是Visual Studio 2010的工作方式. 我处在一个情况下,当程序未进行调试时,我的数据断点完美地工作(它崩溃了STATUS_SINGLE_STEP,这是数据断点提出的例外).如果我要与WindBG进行调试,它也会正确打破.但是,当在任何一个Visual Studio 2010中调试它时,它似乎只是保持卡车运输并忽略断点.有人在Windows 7下的Visual Studio 2010下使用编程设定的数据断点有任何经验吗?我需要做些什么才能破裂吗? (我尝试将STATUS_SINGLE_STEP添加到"第一次偶然异常"列表中,而行为没有变化.) 另外,在调试器中,我可能会做些什么来吞噬STATUS_SINGLE_STEP例外
2 2023-11-23
编程技术问答社区
如何在Visual Studio 2010中添加x64(或任何CPU)作为构建选项(从控制台应用程序到类库)。
最初,我使用大众运输作为我的服务总线.最近,我切换到 nservicebus ,这不需要您制作控制台应用程序,而是一个类库.在项目属性中,我只是切换了将其从控制台应用程序更改为库的设置,但是您只能为x86构建它的约束仍然有效. 我无法将构建类型更改为任何CPU,因为它是一个控制台应用程序,现在应该有效.有什么方法可以完全将我的应用程序更改为类库的应用程序,以便我可以运行构建任何CPU选项?我需要创建一个新项目,将文件复制到其中吗?还是更简单,就像更改项目中的某些内容(.proj)文件一样? 堆栈溢出问题 缺失调试|项目的任何CPU构建配置用于项目,并默认为Windows X64 上的调试| x86 仅适用于控制台应用程序的x86这个问题. 解决方案 您只需要在配置管理器中的任何CPU添加配置. 1)右键单击解决方案并选择属性 2)选择配置属性,然后单击配置管理器... 3)将活动解决方案平台更改为任何CPU.如果没有任何CPU平台,请跳至#4.
2 2023-11-23
编程技术问答社区
为什么MSVC在执行这个比特测试之前会发出一个无用的MOVSX?
在2013年MSVC中编译以下代码,64位发布构建,/O2优化: while (*s == ' ' || *s == ',' || *s == '\r' || *s == '\n') { ++s; } 我得到以下代码 - 使用64位寄存器作为带有bt(BIT TEST)指令的查找表的非常酷的优化. mov rcx, 17596481020928 ; 0000100100002400H npad 5 $LL82@myFunc: movzx eax, BYTE PTR [rsi] cmp al, 44 ; 0000002cH ja SHORT $LN81@myFunc movsx rax, al bt rcx, rax jae SHORT $LN81@myFunc i
0 2023-11-20
编程技术问答社区
如何判断一个.NET程序集是否被编译为x86、x64或任何CPU?
是否最简单的发现方法(无访问源项目)是.NET组件DLL是否被编译为" x86"," x64"或"任何CPU"? 更新:命令行实用程序足以满足我的近期需求,但是仅出于完整的目的,如果有人想告诉我如何以编程方式进行操作,那也很感兴趣,我敢肯定. 解决方案 如果您只想在给定的DLL上找到它,则可以使用 corflags 是Windows SDK的一部分的工具: CorFlags.exe assembly.dll 如果您想使用代码执行此操作,请查看 getPekind 模块a> class: Assembly assembly = Assembly.LoadFrom("path to dll"); PortableExecutableKinds peKind; ImageFileMachine imageFileMachine; assembly.ManifestModule.GetPEKind(out peKind, out imageFileMachine)
2 2023-11-20
编程技术问答社区
如何用CMAKE在Windows上通过命令行构建x86和/或x64?
通过Visual Studio在Windows上构建X86的一种方法是这样: 开始Visual Studio命令提示x86 运行cmake:cmake -G "NMake Makefiles" \path_to_source\ nmake 通过Visual Studio在Windows上构建X64的一种方法就像: 开始Visual Studio命令提示x64 运行cmake:cmake -G "NMake Makefiles" \path_to_source\ nmake 使用cmake,我如何编译两种架构? (就像Visual Studio在IDE中的工作方式一样) 解决方案 这不能用CMAKE完成.您必须生成两个独立的构建文件夹.一个用于x86 nmake build,另一个用于x64 nmake build.您不能生成一个带有CMAKE的两个体系结构的单个Visual Studio项目. 从命令行构建Visual Studio项目,用于
0 2023-11-20
编程技术问答社区
VS:使用_BitScanReverse64本征的意外优化行为
以下代码在调试模式下工作正常,因为_bitscanreverse64被定义 如果没有设置,则返回0. 引用msdn : (返回值为)"如果设置了索引,则非零,或者如果找不到设置位,则为0." '' 如果我在发行模式中编译此代码仍然有效,但是如果我启用编译器 优化,例如\ o1或\ o2索引不是零,assert()失败. #include #include using namespace std; int main() { unsigned long index = 0; _BitScanReverse64(&index, 0x0ull); cout
0 2023-11-20
编程技术问答社区
在visual studio中的外部汇编文件
我搜索了,发现我无法在Visual Studio中的X64中使用__asm.相反,我必须使用外部汇编文件. 如何将外部装配文件添加到我的Win32控制台项目? 如何编译它们? 您可以逐步解释 解决方案 如何在Visual Studio中使用X64组装文件构建混合源X64项目: 1)启动Visual Studio(社区)2015,然后选择FILE - New - Project. 2)在下一个窗口中,选择Win 32 Console Application. 3)您获得了确认.单击Next >. 4)在下一个窗口中,您可以接受默认设置.单击Finish. 5)确保该项目在解决方案资源管理器中突出显示,然后从菜单中选择PROJECT - Build Customizations.... 6)在下一个窗口tick masm(.targets,.props)中,单击OK. 7)选择Build - Configuration Ma
8 2023-11-20
编程技术问答社区
在同一个解决方案/项目中用Visual Studio同时针对32位和64位
我对如何设置视觉工作室的建造有一些困境. 背景:c#.net v2.0,p/indoking to 32 partion 32 bit dll,sql compact v3.5 sp1,带有设置项目. 现在,平台目标设置为x86,因此可以在Windows X64上运行. 这家第三方公司刚刚发布了64位DLL版本,我想构建一个专用的64位程序. 这提出了一些我尚未得到答案的问题. 我想拥有完全相同的代码库. 我必须以引用DLL或64位DLL的32位集合. (第三方和SQL Server Compact) 可以使用2组新的配置(debug64和Release64)? 来解决此问题 我必须创建2个单独的设置项目(std.VisualStudio Projects,No Wix或任何其他实用程序),或者可以在同一.msi? 中解决此问题. 任何想法和/或建议都将受到欢迎. 解决方案 是的,您可以在同一项目中使用相同的代码库来定位X86和X64.通常,如
2 2023-11-20
编程技术问答社区
xmm8寄存器的值在不同的调用中是否被保留?
使用Visual Studio 2017编译的Windows程序会做以下操作: 调用一个例程,该例程具有带有值35.05的默认参数. 通过C接口初始化Java虚拟机 再次调用带有值35.05的默认参数的例程. 在第一个呼叫中,默认参数获得正确的35.05.在第二个通话中,该值是垃圾. 我查看了生成的汇编,在第一个呼叫期间,带有默认参数35.05从内存位置复制到xmm8,然后复制到堆栈(是第五参数),并进行了调用: 0033d 48 8b 01 mov rax, QWORD PTR [rcx] 00340 41 b8 14 00 00 00 mov r8d, 20 // a default argument 00346 f3 44 0f 10 05 00 00 00 00 movss xmm8, DWORD PTR __real@420c3333 // this is 35.05 0034f f3 44
2 2023-11-20
编程技术问答社区
Access x64 TEB C++ & Assembly
在32位组件中,我可以访问TEB结构的ProcessEnvironmentBlock.从那里我访问TEB结构的Ldr 此处描述了此技术: > 在32位组件中执行此操作的代码是: void* ptr = NULL; __asm { mov eax, FS:[0x18] mov eax, [eax + 0x30] //Offset of PEB mov eax, [eax + 0x0C] //Offset of LDR in PEB structure mov eax, _ptr }; std::cout
0 2023-11-20
编程技术问答社区
为什么在x64中忽略了__ stdcall调用惯例?
我知道__cdecl和__stdcall之间的区别是什么,但是我不确定为什么x64构建中的编译器会忽略__stdcall. 以下代码中的功能 int __stdcall stdcallFunc(int a, int b, int c, int d, int e, int f, int g) { return a + b + c + d + e + f + g; } int __cdecl cdeclFunc(int a, int b, int c, int d, int e, int f, int g) { return a + b + c + d + e + f + g; } int main() { stdcallFunc(1, 2, 3, 4, 5, 6, 7); cdeclFunc(1, 2, 3, 4, 5, 6, 7); return 0; } 有足够的参数超过可用的CPU寄存器.因此,必须通过堆栈通过一些论点.我
4 2023-11-20
编程技术问答社区
在Visual C++中是否有适用于X64的8位原子CAS(cmpxchg)本征?
在32位Visual Studio C ++中进行以下代码.是否有64位的同等用途,因为在Visual Studio C ++的64位版本中不支持Inline ASM? FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval) { bool result=false; __asm { mov al,oldval mov edx,dest mov cl,newval lock cmpxchg byte ptr [edx],cl setz result } return(result); } 以下仪器在Visual Studio C ++下编译 _InterlockedCompareExchange16 _Interlocked
0 2023-11-20
编程技术问答社区
没有内核帮助的DWCAS-替代方案
我只是想测试我的编译器是否识别... atomic ...并在其上使用dwcase(例如x86-64 lock cmpxchg16b),或者如果它用通常的锁定对. 因此,我首先写了一个最小的程序,该程序具有单个Noinline功能,该程序可以在原子对上进行比较和交换.编译器为此生成了很多我不理解的代码,但我没有看到任何锁定的说明.我很好奇是否 实现将锁定在原子中,并在64位平台上打印了上述原子对的大小:24,因此显然没有锁. 终于写了一个程序,该程序通过我的系统具有的所有线程(Ryzen ThreadRipper 64 Core,Win10,SMT Off)增加了单个原子对的两个部分.然后,我计算了纳秒中每个增量的时间.时间相当高,每个成功增量的时间约为20.000ns,因此首先是 如果有一个锁,我忽略了;因此,这种原子的大小为24个字节并非如此.当我在观众的过程中看到时,我看到所有64个内核几乎均以100%的用
4 2023-11-20
编程技术问答社区
MSVC编译器生成的mov ecx, ecx看起来毫无用处
我有一些C ++代码,该代码正在使用MSVC编译器V14.24: 编译为以下组件 00007FF798252D4C vmulsd xmm1,xmm1,xmm7 00007FF798252D50 vcvttsd2si rcx,xmm1 00007FF798252D55 vmulsd xmm1,xmm7,mmword ptr [rbx+28h] 00007FF798252D5A mov ecx,ecx 00007FF798252D5C imul rdx,rcx,0BB8h 00007FF798252D63 vcvttsd2si rcx,xmm1 00007FF798252D68 mov ecx,ecx 00007FF798252D6A add rdx,rcx 00007FF798252D6D add rdx,rdx 00007FF79
0 2023-11-20
编程技术问答社区