首页 文章

学习Linux x86-64汇编和文档的建议[关闭]

提问于
浏览
19

有没有人有关于学习Linux x86-64程序集基础知识的文档?我不确定是否要按原样学习它,或者先学习x86,然后再学习它,但是因为我有一台x86-64计算机而不是x86,我正在考虑学习x86-64; )

也许有人可以给我一些激励,并指导学习什么,如何以及用什么文档 .

请给我你最喜欢的文档 Headers ,我编写一些Python,这是我第一次尝试低级语言,而且我已经准备好专注于它 .

谢谢大家

3 回答

  • 2

    一般建议:

    它不仅仅是“x86汇编程序” . 每个汇编程序有点不同,它们通常不相互兼容 . 我推荐使用NASM汇编程序,因为它使用广泛,易于安装,并支持64位汇编 .

    阅读一本关于x86汇编程序的好书,以了解基础知识(寄存器,条件跳转,算术等) . 我刚开始的时候读过Randall Hyde的装配艺术 .

    http://asm.sourceforge.net看起来它有一些你可能想要解决的好教程 . 但是如果你在64位模式下进行组装,请注意C函数和系统调用的调用约定是不同的 .

    您将需要CPU参考手册 . 就个人而言,我更喜欢AMD的 . 您需要CPU手册的第1卷和第3卷 . 其他卷也可能是有意义的 .

    64具体的建议

    64位x86组件几乎与32位x86组件相同,因为64位x86大部分向后兼容32位 . 您可以访问64位寄存器和一些其他功能,一些不起眼的指令不再有效,其余的与32位相同 .

    但是,64位Linux上的系统调用约定完全不同 . 根据您的内核,32位系统调用可能可用,也可能不可用 . 更糟糕的是,64位调用约定的记录很少 . 我只是通过检查glibc源代码的深度来解决它 .

    为了省去找到困难的麻烦,系统调用号码在 arch/x86/include/asm/unistd_64.h 下的Linux源代码中 . 系统调用号在 rax 寄存器中传递 . 参数位于 rdirsi ,_ rdxr10r8r9 . 使用 syscall 指令调用该调用 . syscall 会覆盖 rcx 寄存器 . 回报在 rax . (可以找到一个简短的例子here . )

  • 1

    看看here这是Linux程序集开发的最佳位置,您将找到资源,文档和链接 .

  • 24

    The 对x86的规范引用可能是Intel® 64 and IA-32 Architectures Software Developer's Manual . 从PIII是新的时候开始,我还有这个系列的一些卷 . 还有一个AMD64 Architecture Programmer’s Manual,这可能很有趣,因为英特尔没有完全跟随AMD 's lead in x86-64 design, but I haven't读它 .

    X86 Opcode and Instruction Reference与广告完全一样:x86(-64)操作码和指令,没有别的 . 如果你想快速搜索一些特定的指令,很方便 .

相关问题