我猜想一个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
以下是关于 x86-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内存绑定,但是结果程序没有此限制.
我一直在尝试使用程序化数据断点, 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例外
最初,我使用大众运输作为我的服务总线.最近,我切换到 nservicebus ,这不需要您制作控制台应用程序,而是一个类库.在项目属性中,我只是切换了将其从控制台应用程序更改为库的设置,但是您只能为x86构建它的约束仍然有效. 我无法将构建类型更改为任何CPU,因为它是一个控制台应用程序,现在应该有效.有什么方法可以完全将我的应用程序更改为类库的应用程序,以便我可以运行构建任何CPU选项?我需要创建一个新项目,将文件复制到其中吗?还是更简单,就像更改项目中的某些内容(.proj)文件一样? 堆栈溢出问题 缺失调试|项目的任何CPU构建配置用于项目,并默认为Windows X64 上的调试| x86 仅适用于控制台应用程序的x86这个问题. 解决方案 您只需要在配置管理器中的任何CPU添加配置. 1)右键单击解决方案并选择属性 2)选择配置属性,然后单击配置管理器... 3)将活动解决方案平台更改为任何CPU.如果没有任何CPU平台,请跳至#4.
在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
是否最简单的发现方法(无访问源项目)是.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)
通过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项目,用于
我搜索了,发现我无法在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
我对如何设置视觉工作室的建造有一些困境. 背景: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.通常,如
使用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
我知道__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寄存器.因此,必须通过堆栈通过一些论点.我
在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
我只是想测试我的编译器是否识别... atomic ...并在其上使用dwcase(例如x86-64 lock cmpxchg16b),或者如果它用通常的锁定对. 因此,我首先写了一个最小的程序,该程序具有单个Noinline功能,该程序可以在原子对上进行比较和交换.编译器为此生成了很多我不理解的代码,但我没有看到任何锁定的说明.我很好奇是否 实现将锁定在原子中,并在64位平台上打印了上述原子对的大小:24,因此显然没有锁. 终于写了一个程序,该程序通过我的系统具有的所有线程(Ryzen ThreadRipper 64 Core,Win10,SMT Off)增加了单个原子对的两个部分.然后,我计算了纳秒中每个增量的时间.时间相当高,每个成功增量的时间约为20.000ns,因此首先是 如果有一个锁,我忽略了;因此,这种原子的大小为24个字节并非如此.当我在观众的过程中看到时,我看到所有64个内核几乎均以100%的用
我有一些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