草庐IT

x86-emulation

全部标签

Windows 7 x86 使用 sysenter 执行直接系统调用

我正在尝试编写一些程序来直接调用系统调用而无需通过ntdll.dll我的代码(VisualStudio语法...):#includeintmain(){_asm{pusharg1pusharg2pusharg3moveax,syscall_idmovedx,esp_emit0xf_emit0x34//sysenteropcodes...}当程序尝试执行sysenter指令时,程序因访问冲突而崩溃:CALLDWORDPTRDS:[EAX+EDX*4]//AccessViolationwhenreading[00000128]EAX==0x00000000EDX==0x0000004D我尝

c++ - gcc-c++ 是否没有为当前的 x86-64 处理器优化原子操作

给定以下测试程序:#include#includeint64_tprocess_one(){int64_ta;//Shouldbeatomiconmyhaswellint64_tassign=42;a=assign;returna;}int64_tprocess_two(){std::atomica;int64_tassign=42;a=assign;returna;}intmain(){autores_one=process_one();autores_two=process_two();std::cout编译:g++--std=c++17-O3-march=nativemain.c

c++ - 带有 fat 库的 OS X 上体系结构 x86_64 的 undefined symbol

我自己从源代码构建了libcrypto.a和libssl.a,指定了darwin64-x86_64-cc(对于64位)和darwin-i386-cc(对于32位)到OpenSSL的配置脚本。使用lipo创建胖库并将它们作为依赖项添加到我的Xcode项目中。但是,我遇到了一个undefinedsymbol错误:undefinedsymbolsforarchitecturex86_64:"_OPENSSL_ia32cap_P",referencedfrom:_AES_cbc_encryptinlibcrypto.a(aes-x86_64.o)ld:symbol(s)notfoundfora

c++ - 尽管使用 -fPIC 进行编译,但链接器错误 "relocation R_X86_64_PC32 against undefined symbol"

我正在使用命令行编译一个c++程序g++-cprog.cc-std=c++11-march=native-fPIC-fopenmp然后尝试通过创建一个共享对象g++prog.o-shared-fopenmp-olib/libprog.so这一直有效。但是今天我得到:/usr/bin/ld:prog.o:relocationR_X86_64_PC32againstundefinedsymbol`_ZTVN12_GLOBAL__N_111handle_baseE'cannotbeusedwhenmakingasharedobject;recompilewith-fPIC/usr/bin/l

c++ - 通过 x86 程序集(嵌入在 C++ 中)对数组进行排序?可能的?

我是第一次玩x86汇编,我不知道如何对数组进行排序(通过插入排序)。我理解算法,但汇编让我感到困惑,因为我主要使用Java和C++.这是我目前所拥有的一切intascending_sort(chararrayOfLetters[],intarraySize){chartemp;__asm{pusheaxpushebxpushecxpushedxpushesipushedi////???popedipopesipopedxpopecxpopebxpopeax}}基本上没有:(有什么想法吗?提前致谢。好吧,这只会让我听起来像个彻头彻尾的白痴,但我什至无法更改_asm中数组的任何值为了测试它

c++ - Visual C++ x86 上的 volatile 变量和原子操作

普通加载在x86上具有获取语义,普通存储具有释放语义,但是编译器仍然可以重新排序指令。虽然栅栏和锁定指令(锁定xchg、锁定cmpxchg)防止硬件和编译器重新排序,但仍然需要普通加载和存储来保护编译器屏障。VisualC++提供了_ReadWriterBarrier()函数,它可以防止编译器重新排序,C++也出于同样的原因提供了volatile关键字。我写下所有这些信息只是为了确保我做对了一切。所以上面写的都是真的,是否有任何理由标记为将在受_ReadWriteBarrier()保护的函数中使用的volatile变量?例如:intload(int&var){_ReadWriteBar

c++ - MSVC 无法在 x86 上发送 16 字节对齐的函数参数

我正在使用MSVC来使用一些SSE内在函数。为了支持这一点,我将一些数据对齐到16字节边界。但是,既然我为x86而不是x64编译,MSVC坚持认为我将函数参数对齐到16字节是非法的。但如果这是真的,那么怎么会有人将SSE数据类型作为函数参数发送呢?那么如何在函数中发送16字节对齐的参数? 最佳答案 ifthat'struethenhowcananyoneeversendSSEdatatypesasfunctionparameters?你不能。:)在Microsoft的ABI下,您必须通过引用或指针传递它。一种解决方法可能是使用fas

c++ - 如何在 x86 和 x64 平台之间使用 boost::serialization

我有一个在Windows下作为64位应用程序运行的程序。我想要同一个程序作为32位应用程序工作。它可以编译、链接和运行,但我无法在32位应用程序中读取我用64位应用程序存储的文件。我使用带有二进制存档的boost::serialization来写入和读取文件。该软件已经发布给客户。客户端应该能够使用32位应用程序读取64位应用程序存储的文件。这可能吗?如何?有经验吗? 最佳答案 您可以编写一个64位应用程序,将二进制存档转换为xml存档。这些您可能可以使用32位应用程序阅读并转换为您选择的格式。

c++ - 如何在 x86 和 x64 中对函数进行 thunk? (类似于 C++ 中的 std::bind,但是是动态的)

我如何在x86和x64上使用任意(固定)数量的参数对任意函数进行thunk?(我不需要float,SSE之类的,参数都是整数或者指针。) 最佳答案 这是我的通用实现。我最初是用AsmJit做的,然后手动修改它以删除依赖项。它适用于x86和x64!它适用于cdecl和stdcall!它应该也适用于VC++和GCC上的“thiscall”,但我还没有测试过它。(VC++可能不会触及“this”指针,而GCC会将其视为第一个参数。)它可以在参数列表的任何位置绑定(bind)任意个参数!请注意:它不适用于可变参数函数,例如printf。这样

c++ - 通过 gcc-6 在 OSX Sierra 上安装时,保持 "FATAL:/opt/local/bin/../libexec/as/x86_64/as: I don' t 理解 'm' 标志!”错误

环境信息操作系统:macOS10.12.2(16C68)编译器:gcc-6重现步骤我已经安装了gcc-6并根据需要修改了config.mk到导出CC=gcc-6导出CXX=g++-6但是一直有这个错误:g++-6-c-std=c++0x-Wall-Wno-unknown-pragmas-Iinclude-Idmlc-core/include-Irabit/include-O3-funroll-loops-msse2-fPIC-fopenmpsrc/learner.cc-obuild/learner.oFATAL:/opt/local/bin/../libexec/as/x86_64/a