在看一些反编译的C代码时,我看到了这个: movl -0xc(%rbp), %esi movl %esi, -0x8(%rbp) 这对应于这个C代码: x = y; 这让我想到:gcc如何将y移动到%esi ,然后将%esi移动到x而不是直接将y移动到x ? 这是整个C和反编译的代码,如果它很重要: C int main(void) { int x, y, z; while(1) { x = 0; y = 1; do { printf("%d\n", x); z = x + y; x = y; y = z; } while(x < 255); } } 反编译 pushq %rbp […]
我在哪里可以find在这个架构上assembly的新寄存器的名称? 我指的是X86中的寄存器,比如EAX,ESP,EBX等,但是我希望它们在64位。 我不认为它们与拆解我的C代码时是一样的,我得到r而不是e。
反正有这个可以做的吗? 我已经使用objdump,但是不会产生汇编输出,我知道任何汇编程序都会接受这个汇编输出。 我希望能够更改可执行文件中的指令,然后再进行testing。
在x86上有两种众所周知的方法来将整数寄存器设置为零值。 或 mov reg, 0 要么 xor reg, reg 有一种观点认为,第二个变体是更好的,因为值0没有存储在代码中,并节省了生成的机器代码的几个字节。 这绝对是好的 – 使用更less的指令caching,这有时可以允许更快的代码执行。 许多编译器产生这样的代码。 然而,异或指令和改变相同寄存器的先前指令之间存在正式的指令间依赖关系。 由于存在依赖性,后者的指令需要等到前一个指令完成,这可以减less处理器单元的负载并伤害性能。 add reg, 17 ;do something else with reg here xor reg, reg 很显然,无论初始寄存器值如何,异或的结果都是完全相同的。 但是处理器能够识别这个吗? 我在VC ++ 7中尝试了以下testing: const int Count = 10 * 1000 * 1000 * 1000; int _tmain(int argc, _TCHAR* argv[]) { int i; DWORD start = […]
我们最近试图将我们的一些Visual Studio项目拆分成库,并且一切似乎都在一个testing项目中编译和构build,其中一个库项目作为依赖项。 但是,试图运行该应用程序给了我们下面的令人讨厌的运行时错误消息: 运行时检查失败#0 – ESP的值在函数调用中未正确保存。 这通常是调用用不同调用约定声明的函数指针的结果。 我们甚至从来没有为我们的函数指定调用约定(__cdecl等),使所有编译器开关保持默认状态。 我检查了一下,项目设置对于在库和testing项目中调用约定是一致的。 更新:我们的一个开发人员将“基本运行时间检查”项目设置从“Both(/ RTC1,equiv。to / RTCsu)”更改为“Default”,运行时间消失,程序运行显然正常。 我完全不信任这个。 这是一个合适的解决scheme,还是一个危险的黑客?
我不明白CMP之后的JG/JNLE/JL/JNGE指令。 例如,如果我有: CMP al,dl jg label1 当al=101; dl =200 al=101; dl =200 。 关于我们问什么jg ? 这是在al>dl ? 或al-dl>0 ? 下一个代码也是一样的: test al,dl jg label1 我不明白我们比较什么,以及我们问什么“ jg ”。 换句话说,我不明白我们什么时候会跳到标签1,什么时候我们不会。 谢谢。
我知道一些显着的x64架构(更高的可寻址RAM地址等)的收益…但是: 如果我的程序没有真正需要在本地64位模式下运行,该怎么办? 我应该移植它吗? 是否有可预见的结束32位支持的最后期限? 我的应用程序能够像原生x64代码一样运行得更快/更好/更安全吗?
有什么办法,如何获得Android模拟器与谷歌地图SDK工作的新的x86图像?
在阅读“理解Linux内核”一书时,我已经习惯了这些指令。 我查了参考手册。 5.1.9 I / O指令 这些指令在处理器的I / O端口和寄存器或存储器之间移动数据。 IN Read from a port OUT Write to a port INS/INSB Input string from port/Input byte string from port INS/INSW Input string from port/Input word string from port INS/INSD Input string from port/Input doubleword string from port OUTS/OUTSB Output string to port/Output byte string to port […]
我正在为最近正在处理的业余爱好虚拟机编写一个JIT编译器。 我知道一些程序集,(我主要是一个C程序员,我可以阅读大部分程序集,但是我不明白这些操作码的含义,然后编写一些简单的程序),但是我很难理解几个例子自我修改的代码我在网上find的。 这是一个这样的例子: http : //asm.sourceforge.net/articles/smc.html 所提供的示例程序在运行时进行了大约四种不同的修改,其中没有一个被清楚地解释。 Linux内核中断被多次使用,并没有解释或详细说明。 (作者在调用中断之前把数据移到了几个寄存器中,我假设他正在传递参数,但是这些参数根本没有解释,让读者猜测)。 我正在寻找的是自修改程序代码中最简单,最直接的例子。 有些东西我可以看一下,用来理解x86程序集中的自修改代码是如何编写的,以及它是如何工作的。 是否有任何资源可以指向我,或者您可以提供哪些可以充分certificate这一点的例子? 我正在使用NASM作为我的汇编程序。 编辑:我也在Linux上运行这个代码。