草庐IT

ASSEMBLY

全部标签

c++ - x86-64 程序集 : why offset 25 bytes?

我今天开始学习x86汇编,通过分析与这个c++示例对应的汇编代码(我知道存在类似atoi的东西,但我想使示例保持最小):#includestd::vectorrange(intN){std::vectorv(N);for(unsignedinti=0;i如果使用g++-O0-S-fno-stack-protectorreturn_by_value.cpp进行编译,则会产生以下摘录:..._Z5rangei:.LFB509:.cfi_startproc.cfi_personality0x3,__gxx_personality_v0.cfi_lsda0x3,.LLSDA509pushq%r

c++ - getch 相当于汇编语言

我在汇编语言中编程,在C++中使用x86,我需要知道汇编语言中的getch等价物而不是C++语言,因为我不想使用C++编程语言中的任何函数。我在网上找到了代码,但它将给定值保存到一个变量中,并在C++中创建。我只想使用该功能来停止程序,直到按下任何键。我不必在进一步的编程中使用输入的键值。 最佳答案 这是一个特定于操作系统的问题。例如,如果您使用的是Linux,则可以像这样发出read系统调用:;Allocatesomestackbuffer...subesp,256moveax,3;3=__NR_readfrommovebx,0;

c++ - 我如何正确地将 asm 文件链接到 C++?

这是一个硬件问题,我已经完成了所有编码,但我无法将asm与C++链接,我使用的是WindowsVisualStudio2010,我将主要文件放在源文件中,将我的asm文件放在资源文件中,当我尝试编译它只会给我一个链接错误1>------Buildstarted:Project:clearArray,Configuration:DebugWin32------1>clearArray.cpp1>clearArray.obj:errorLNK2019:unresolvedexternalsymbol_clearPointerOpreferencedinfunction_main1>clea

c++ - GCC 汇编代码生成错误和解决方法

GCC4.5.2(在Ubuntu11.10x64上,但编译为32位)生成无效的汇编代码,我很好奇是否可以在不更改代码的情况下修复,只需应用选项或类似的东西。请注意,优化已经是-O0。我有两个功能:inlinelongClass::Get(){longv=*(long*)(m_p);m_p+=4;returnv;}inlinevoidClass::Command(){m_p+=Get();}GCC4.5.2生成此汇编代码:9840m_p+=Get();f689eff5:mov0x8(%ebp),%eaxf689eff8:mov0xd4(%eax),%eaxf689effe:mov%eax

c++ - 将 GCC 内联汇编 CMOV 转换为 Visual Studio 汇编器

文章中Linearvs.BinarySearch,有一个使用CMOV指令的二进制搜索的快速实现。我想在VC++中实现它,因为我正在处理的应用程序依赖于二进制搜索的性能。该实现有一些GCC内联汇编器,声明如下:staticintbinary_cmov(constint*arr,intn,intkey){intmin=0,max=n;while(min>1;asm("cmpl%3,%2\n\tcmovg%4,%0\n\tcmovle%5,%1":"+r"(min),"+r"(max):"r"(key),"g"(arr[middle]),"g"(middle+1),"g"(middle));

c++ - 优化长时间的内存读写

我有一个名为reorder.cc的源文件,如下所示:voidreorder(float*output,float*input){output[56]=input[0];output[57]=input[1];output[58]=input[2];output[59]=input[3];output[60]=input[4];...output[75]=input[19];output[76]=input[20];output[77]=input[21];output[78]=input[22];output[79]=input[23];output[80]=input[24];...

c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程

我需要帮助从反汇编中对虚拟方法进行逆向工程。代码最初是用Microsoft的VisualC++编译的。问题方法如下:sub_92D110procnearxoral,alretnsub_92d110endp这个方法在很多类之间被引用,甚至在一个类的虚表中被多次引用。我不确定它的作用;这是否意味着该方法已内联但调用仍然存在以便vtable保持其大小?如果是这样,xoral,al做了什么?我是不是误解了调用约定之类的东西? 最佳答案 这很可能是这样的:boolsomeclass::somemethod(){returnfalse;}说明x

c++ - 从编译器的角度来看,如何处理数组的引用,以及为什么不允许按值传递(而不是衰减)?

正如我们所知,在C++中,我们可以像f(int(&[N])一样将数组的引用作为参数传递。是的,它是由iso标准保证的语法,但我很好奇编译器在这里是如何工作的。我找到了这个thread,但不幸的是,这并没有回答我的问题——编译器是如何实现这个语法的?然后我写了一个demo,希望能从汇编语言中看到一些东西:voidfoo_p(int*arr){}voidfoo_r(int(&arr)[3]){}templatevoidfoo_t(int(&arr)[length]){}intmain(intargc,char**argv){intarr[]={1,2,3};foo_p(arr);foo_r

c++ - 如何通过反汇编从 C++ 函数中获取 "lea"指令?

我正在尝试学习逆向工程,但我被这件小事困住了。我有这样的代码:.text:10003478moveax,HWHandle.text:1000347Dleaecx,[eax+1829B8h]我想知道,它在C或C++中看起来如何?尤其是箭头所指的两条指令。HWHandle是一个变量,它保存从GetModuleHandle()函数返回的值。更有趣的是,在这条指令下面的几行中,dword_1000FCA0被用作一个函数:.text:1000353Cmoveax,dword_1000FCA0.text:10003541movecx,[eax+0A0h].text:10003547pushoffs

c++ - 什么寄存器指向堆?

我刚学完ARM架构/汇编。如果SP寄存器保存着下一个要放入数据的内存位置的地址,那么什么保存堆的地址呢?例如,在C++中,如果您在堆上声明一个对象(例如MyObjexample=newMyObj();),程序集会是什么样子,从某种意义上说它会在哪里知道example是? 最佳答案 在此上下文中,堆栈是OS/EABI提供的较低级别结构。这就是为什么有一个常规寄存器的原因。但是,堆是操作系统提供的更高级别的结构。因此,管理和使用它取决于与您的应用程序和操作系统的协议(protocol)。在汇编术语中,您将使用该堆并通过寄存器取消引用某些