为什么参数优先放寄存器
现代调用约定里,前几个参数都用寄存器传,多出来的才放栈上。因为【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"