为什么参数优先放寄存器

现代调用约定里,前几个参数都用寄存器传,多出来的才放栈上。因为【0】。

开始练习 →

谁负责保存寄存器

调用约定会把寄存器分成两类:一类调用方自己保存,一类被调方保存。这么分是为了【0】。

开始练习 →

参数是怎么接进来的

运行下面这段程序,填写它打印出来的结果。 ASM = """ push rbp mov rbp, rsp mov dword ptr [rbp - 4], edi mov dwor

开始练习 →

返回值放在哪

运行下面这段程序,填写它打印出来的结果。 ASM = """ push rbp mov rbp, rsp mov dword ptr [rbp - 4], edi mov dwor

开始练习 →

自己写:按约定接参数

模拟调用约定:前两个参数放 edi 和 esi,返回值放 eax。

开始练习 →

参数超过寄存器数量怎么办

约定说前两个参数走寄存器,多出来的走栈。传五个参数,把「走寄存器的几个 / 走栈的几个」和栈上的内容打出来。

开始练习 →

⚠️ 两边约定不一致

调用方按「前两个走寄存器」放参数,被调方却按「全部走栈」去取。⚠️ 程序不会报错,把被调方取到的两个值打出来。

开始练习 →

反推逻辑先看什么

拿到一段陌生汇编,最该先看的是【0】。

开始练习 →

往回跳意味着什么

一段汇编里出现了「往回跳」的指令,这多半是【0】。

开始练习 →

这段汇编在算什么

运行下面这段程序,填写它打印出来的结果。 def run(src, regs=None, guard=200): R = {"eax": 0, "ebx": 0, "ecx"

开始练习 →