在阅读汇编程序时,我经常遇到一些人,他们会推送一个处理器的某个寄存器,稍后再popup来恢复它以前的状态。 你怎么能推注册? 它在哪里推? 为什么这需要? 这是归结为一个单一的处理器指令还是更复杂?
我真的想学汇编。 我非常擅长c / c ++,但是希望能够更好地理解更低级别的情况。 我意识到,汇编相关的问题之前已经被问到,但我只是寻找一些特定于我的情况的方向: 我正在运行Windows 7,并且对我应该如何开始使用程序集进行混淆。 我是否必须从x64开始,因为我正在运行Windows 7? 有人说“先从32位开始” – 我该怎么做呢? 我的操作系统与编写“32”或“64”位程序集的能力有什么关系? 事实上,'n bit'组件是什么意思,其中n是一个数字? 编辑: 以下是一些帮助我开始assembly的链接; 其他刚刚入门的人可能会发现他们有帮助。 我将继续更新这个列表,因为我继续我的程序集:) 注意:正如我一直在学习,我决定把重点放在用masm32编程。 所以下面的大部分资源都是关注的。 x86 标记wiki (初学者指南,参考手册,ABI文档等)。 www.masm32.com X86大会WikiBook X86反汇编WikiBook (很好理解一些约定,以及如何将高级代码翻译成汇编的基础知识) WinAsm IDE (与masm32很好地搭配) 简介:Windows汇编 (所有代码示例均适用于masm32) 中断列表 汇编教程 (非常适合帮助理解核心概念) x86汇编指南 Agner Fog的软件优化资源 ,包括一些关于在不同平台(Windows与Linux / OS X)上调用约定的好东西,以及大量关于如何有效地完成特定事情的例子。 对于初学者来说不是很好,但是对于中级到高级的读者来说非常好。 (对于英特尔和AMD处理器的每条指令,他也有详细的性能信息,对于严格的性能微型优化非常有用。有些初学者可能想看看其中的一些,开始思考CPU如何工作,以及为什么你可以做一些而不是另一个。)
我想写一个小的低级程序。 对于它的某些部分,我将需要使用汇编语言,但其余的代码将写在C / C + +。 因此,如果我将使用GCC将C / C ++与汇编代码混合,是否需要使用AT&T语法,还是可以使用Intel语法? 或者你如何以其他方式混合使用C / C ++和asm(intel语法)? 我意识到,也许我没有select,必须使用AT&T的语法,但我想确定.. 如果没有select,我可以在哪里find有关AT&T语法的完整/官方文档? 谢谢!
我相当新的Linux(Ubuntu 10.04)和汇编的新手。 我正在关注一些教程,我找不到特定于Linux的任何东西。 所以,我的问题是,编译/运行汇编程序有什么好的包,编译/运行该程序包的命令行命令是什么?
在下面使用objdump转储的汇编代码中: lea 0x0(%esi,%eiz,1),%esi 什么是注册%eiz ? 前面的代码是什么意思?
在x86汇编代码中, JE和JNE与JZ和JNZ是否完全一样?
我有一个128位无符号整数A和一个64位无符号整数B.计算A % B的最快方法是什么?这是将A除以B得到的(64位)余数? 我正在寻找以C或汇编语言来做到这一点,但我需要针对32位的x86平台。 这不幸意味着我不能利用128位整数的编译器支持,也不能利用x64体系结构在单个指令中执行所需操作的能力。 编辑: 感谢您迄今的答复。 但是,在我看来,推荐的algorithm会非常慢 – 不是执行128位乘64位除法的最快方法是利用处理器对64位乘32位的本机支持吗? 有没有人知道是否有办法在几个较小的部门执行更大的部门? Re:B多久换一次? 主要是我对一个通用的解决scheme感兴趣 – 如果A和B每次都可能会有所不同,你会进行什么样的计算? 但是,第二种可能的情况是B不会像A那么频繁地变化 – 可能有多达200个A被B分开。在这种情况下你的答案会有什么不同?
显示可能会出错的gcc优化和用户代码示例 下面代码片段中的函数“foo”只会加载其中一个结构成员A或B; 至less这是未经优化的代码的意图。 typedef struct { int A; int B; } Pair; int foo(const Pair *P, int c) { int x; if (c) x = P->A; else x = P->B; return c/102 + x; } 以下是gcc -O3给出的内容: mov eax, esi mov edx, -1600085855 test esi, esi mov ecx, DWORD PTR [rdi+4] <– ***load P->B** cmovne […]
我写空的程序来惹恼从stackoverflow编码器,地狱。 我只是在探索GNU工具链。 现在下面可能对我来说太深了,但为了继续空的程序传奇,我已经开始研究C编译器的输出,即GNU消耗的东西。 gcc version 4.4.0 (TDM-1 mingw32) test.c的: int main() { return 0; } gcc -S test.c .file "test.c" .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp call ___main movl $0, %eax leave ret 你能解释一下这里发生了什么? 这是我的努力来理解它。 […]
有人可以解释下面的汇编代码是做什么的? int 0x80