gra*_*ber 19 documentation x86 assembly doc x86-64
有没有人有关于学习Linux x86-64程序集基础知识的文档?我不确定是否要按原样学习它,或者先学习x86,然后再学习它,但是因为我有一台x86-64计算机而不是x86,我正在考虑学习x86-64; )
也许有人可以给我一些激励,并指导学习什么,如何以及用什么文档.
请给我你最喜欢的文档标题,我编写一些Python,这是我第一次尝试低级语言,而且我已经准备好专注于它.
谢谢大家
Cal*_*lum 24
它不仅仅是"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源代码的深度来解决它.
为了省去找到困难的麻烦,系统调用号码在Linux源代码下arch/x86/include/asm/unistd_64.h
.系统调用号在rax
寄存器中传递.该参数是rdi
,rsi
,rdx
,r10
,r8
,r9
.使用该syscall
指令调用该调用.在syscall
覆盖rcx
寄存器.回归是在rax
.(这里可以找到一个简短的例子.)