先认清楚:你缺的是“寄存器和栈”,不是汇编语法
很多人学逆向、学底层,一上来就背指令、抄代码,结果遇到一个函数调用就懵:为什么 sp 要对齐?bl 跳过去之后 ret 怎么知道回到哪?fp 到底指向哪?这门 ARM 汇编入门课不是让你背指令表,它解决的是最底层的能力缺口——你能不能在脑子里把“寄存器、栈、函数跳转”这三件事串起来。资料包前几节全是这个:进制是基础,寄存器是主角,栈是舞台,bl/ret 是动作。如果你连 r0 到 r15 分别干什么都说不清,后面看任何反汇编都是天书。所以别急着往后翻,先把这几节当主课看。
建议这样看:先寄存器,后栈,最后函数
资料包的顺序不是随便排的。第一节讲进制,不是教你算数,是让你习惯用十六进制看地址、看寄存器值。第二节直接上寄存器,这是整个 ARM 的核心——通用寄存器、程序计数器 pc、链接寄存器 lr、栈指针 sp,你得知道每个寄存器在函数调用里扮演什么角色。第三节是补充,把 CPU 和寄存器的关系再讲一遍,别跳过,很多人就是这里没通。第四节讲栈,sp 和 fp 怎么配合,栈帧是怎么形成的,这是理解函数调用的前提。最后 bl 和 ret 那节才是收口:bl 跳转时把返回地址存到 lr,ret 时从 lr 取地址跳回。建议你按这个顺序看,每节看完自己画一张图:寄存器在左,栈在右,标出 bl 执行前后哪些值变了。不画图,光看视频,第二天就忘。
看完应能回答的问题和配合练习的方法
别假装看懂了。看完这几节,你应该能独立回答下面几个问题:sp 和 fp 有什么区别,为什么需要两个指针?bl 指令执行完,lr 里存的是什么值?ret 是不是一定跳回 lr 指向的地址?如果函数里又调了另一个函数,lr 会被覆盖,怎么办?这些问题答不上来,说明栈那节没吃透。练习方面,资料包里没有单独的练习题,你得自己造:找一段简单的 C 函数,编译成 ARM 汇编,用反汇编工具看它生成的指令,对照课程里讲的 bl、ret、sp、fp 去认。比如写一个 funcA 调 funcB 的代码,编译后看 funcA 开头怎么压栈、funcB 返回后怎么恢复。能把课程里的概念和真实反汇编对上号,这课才算没白看。别追求看完所有指令,先把这几节吃透,后面不管学 ARM64 还是做逆向,底层逻辑都是通的。
课程目录
1-1 [工具介绍] 进制 (26:32) 1-2 [工具介绍] 寄存器 (39:52) 1-3 [工具介绍] 关于CPU&寄存器的补充 (16:10) 1-4 [工具介绍] 栈(sp\fp寄存器) (31:25) 2-1 [函数的本质] bl&ret (28:49)





