草庐IT

ASSEMBLY

全部标签

c++ - 从 DLL 导出 ASM 函数 - Visual Studio C++

我已经创建了Dll项目。我创建了具有一个功能的myasm.asm文件:.486.modelflat,stdcall.codeMyProc1procx:DWORD,y:DWORDxoreax,eax//......//retMyProc1endpend这是我的头文件:#pragmaonce#include#ifdefLAB1DLL_EXPORTS#defineLAB1DLL_API__declspec(dllexport)#else#defineLAB1DLL_API__declspec(dllimport)#endifextern"C"{LAB1DLL_APIint_stdcallMy

c++ - x86 上简单循环中的慢速指令

我有一个用C++编写的简单循环,因为我想分析乘法指令在我的CPU上的性能。我在分析它时生成的汇编代码中发现了一些有趣的细微差别。这是C++程序:#defineTESTS10000000#defineBUFSIZE1000uint32_tbuf_in1[BUFSIZE];uint32_tbuf_in2[BUFSIZE];uint32_tvolatilebuf_out[BUFSIZE];unsignedinti,j;for(i=0;i我使用以下标志编译:优化:代码生成:虽然我在64位机器上运行它,但它是在Win32下的visualstudio2012中编译的。注意buf_out上的vola

C++ 从内存中执行函数

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我最近想到了可预编译的脚本语言,它会在程序加载期间被翻译成机器代码。假设我可以自己生成这个二元函数。现在我需要以某种方式执行它。一般方案如下所示:char*binary=compile("script.sc");pushArgsToStack(1,7);memexec(binary);intret=getEax();有机会让它发挥作用吗?此外,将jmp调用到C++函数地址是否会像计划的那样工作?我的意思是

c++ - 紧凑型 AVX2 寄存器,因此所选整数根据掩码是连续的

这个问题在这里已经有了答案:AVX2whatisthemostefficientwaytopackleftbasedonamask?(6个答案)关闭6年前。在问题OptimizingArrayCompaction,最佳答案是:SSE/AVXregisterswithlatestinstructionsetsallowabetterapproach.WecanusetheresultofPMOVMSKBdirectly,transformingittothecontrolregisterforsomethinglikePSHUFB.Haswell(AVX2)可以做到这一点吗?或者它是否需

c++ - 编译器为内部函数生成程序集的问题

我正在使用英特尔SSE/AVX/FMA内在函数为某些数学函数实现完美的内联SSE/AVX指令。给定以下代码#include#includeautostd_fma(floatx,floaty,floatz){returnstd::fma(x,y,z);}float_fma(floatx,floaty,floatz){_mm_store_ss(&x,_mm_fmadd_ss(_mm_load_ss(&x),_mm_load_ss(&y),_mm_load_ss(&z)));returnx;}float_sqrt(floatx){_mm_store_ss(&x,_mm_sqrt_ss(_mm

c++ - vftable[0] 存储的是第一个虚函数还是 RTTI Complete Object Locator?

我们都知道C++使用vftable来动态决定应该调用哪个虚函数。而我想弄清楚我们调用虚函数时背后的机制。我已将以下代码编译为程序集。usingnamespacestd;classAnimal{intage;public:virtualvoidspeak(){}virtualvoidwash(){}};classCat:publicAnimal{public:virtualvoidspeak(){}virtualvoidwash(){}};voidmain(){Animal*animal=newCat;animal->speak();animal->wash();}汇编代码非常庞大。我不

c++ - 混合使用 C++ 和程序集无法将多个参数从 C++ 函数传递给程序集

我一直对将参数从C++函数传递到程序集感到沮丧。我在Google上找不到任何有用的东西,真的很想得到你的帮助。我正在使用VisualStudio2017和masm来编译我的汇编代码。这是我的c++文件的简化版本,我在其中调用了汇编程序set_clockintmain(){TimeInfolocalTime;charclock[4]={0,0,0,0};set_clock(clock,&localTime);system("pause");return0;}我在汇编文件中遇到了问题。我不明白为什么传递给函数的第二个参数变得很大。我正在离开我的教科书,它显示了带有PROC后跟参数的类似代码

c++ - 使用 Assembly 和 C++ 调用一个函数两次

我有一个代码可以将要调用的函数更改为我的新函数,但我不想只调用我的新函数,我还想调用旧函数。这是一个示例,因此您可以理解我在说什么:如果我反汇编我的.exe,我会看这部分:L00123456:moveax,[L00654321]//doesn'tmattermovecx,[eax+1Ch]//doesn'tmatterpushesi//theonlyparameter0x123callSUB_L00999999//thisisthefunctionIwannaoverwrite//...(0x123是那一行的地址)所以,我使用了这段代码:DWORDold;DWORDfrom=0x123

c++ - 加载前修改汇编指令

我有一个DLL需要加载(我已经编写并编译了它),我想在将DLL加载到内存之前在汇编代码的现有指令之间插入指令。当然,您不能只读取每个字节并将它们插入其中,因为指令有时是多个字节。我正在考虑使用Udis86之类的东西,一条一条地读取指令,然后将它们写入内存,然后在它们之间编写我的其他指令。这是一个好方法还是有更好的方法? 最佳答案 转移指令不是一个好主意。许多x86指令都取决于它们的位置,所以如果你移动它们,你可能会破坏很多东西。您可以做的是在需要修补的地方复制指令;将jmp修补到某个空闲区域,然后在该空闲区域放置复制的指令、您的额外

c++ - 在 x64 上获取没有 __asm 的 SSE 版本

我正在尝试构建VS2010CRT库的某些函数的略微修改版本,除了它尝试访问可能包含指令集体系结构版本(ISA)的全局变量的部分外,一切都很好:if(__isa_available>__ISA_AVAILABLE_SSE2){//...}elseif(__isa_available==__ISA_AVAILABLE_SSE2){//...}我在程序集文件中找到它应该包含的值__ISA_AVAILABLE_X86equ0__ISA_AVAILABLE_SSE2equ1__ISA_AVAILABLE_SSE42equ2__ISA_AVAILABLE_AVXequ3如何以及在哪里为__isa_