有没有人有关于学习Linux x86-64程序集基础知识的文档?我不确定是否要按原样学习它,或者先学习x86,然后再学习它,但是因为我有一台x86-64计算机而不是x86,我正在考虑学习x86-64; )
也许有人可以给我一些激励,并指导学习什么,如何以及用什么文档 .
请给我你最喜欢的文档 Headers ,我编写一些Python,这是我第一次尝试低级语言,而且我已经准备好专注于它 .
谢谢大家
它不仅仅是“x86汇编程序” . 每个汇编程序有点不同,它们通常不相互兼容 . 我推荐使用NASM汇编程序,因为它使用广泛,易于安装,并支持64位汇编 .
阅读一本关于x86汇编程序的好书,以了解基础知识(寄存器,条件跳转,算术等) . 我刚开始的时候读过Randall Hyde的装配艺术 .
http://asm.sourceforge.net看起来它有一些你可能想要解决的好教程 . 但是如果你在64位模式下进行组装,请注意C函数和系统调用的调用约定是不同的 .
您将需要CPU参考手册 . 就个人而言,我更喜欢AMD的 . 您需要CPU手册的第1卷和第3卷 . 其他卷也可能是有意义的 .
64位x86组件几乎与32位x86组件相同,因为64位x86大部分向后兼容32位 . 您可以访问64位寄存器和一些其他功能,一些不起眼的指令不再有效,其余的与32位相同 .
但是,64位Linux上的系统调用约定完全不同 . 根据您的内核,32位系统调用可能可用,也可能不可用 . 更糟糕的是,64位调用约定的记录很少 . 我只是通过检查glibc源代码的深度来解决它 .
为了省去找到困难的麻烦,系统调用号码在 arch/x86/include/asm/unistd_64.h 下的Linux源代码中 . 系统调用号在 rax 寄存器中传递 . 参数位于 rdi , rsi ,_ rdx , r10 , r8 , r9 . 使用 syscall 指令调用该调用 . syscall 会覆盖 rcx 寄存器 . 回报在 rax . (可以找到一个简短的例子here . )
arch/x86/include/asm/unistd_64.h
rax
rdi
rsi
rdx
r10
r8
r9
syscall
rcx
看看here这是Linux程序集开发的最佳位置,您将找到资源,文档和链接 .
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)操作码和指令,没有别的 . 如果你想快速搜索一些特定的指令,很方便 .
3 回答
一般建议:
它不仅仅是“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
寄存器中传递 . 参数位于rdi
,rsi
,_rdx
,r10
,r8
,r9
. 使用syscall
指令调用该调用 .syscall
会覆盖rcx
寄存器 . 回报在rax
. (可以找到一个简短的例子here . )看看here这是Linux程序集开发的最佳位置,您将找到资源,文档和链接 .
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)操作码和指令,没有别的 . 如果你想快速搜索一些特定的指令,很方便 .