参数是怎么接进来的
运行下面这段程序,填写它打印出来的结果。 ASM = """ push rbp mov rbp, rsp mov dword ptr [rbp -
阅读更多 →
谁负责保存寄存器
调用约定会把寄存器分成两类:一类调用方自己保存,一类被调方保存。这么分是为了【0】。
阅读更多 →
为什么参数优先放寄存器
现代调用约定里,前几个参数都用寄存器传,多出来的才放栈上。因为【0】。
阅读更多 →
调用约定是给谁定的
「调用约定」规定了参数放哪儿、返回值放哪儿、谁负责保存寄存器。它是【0】。
阅读更多 →
⚠️ 忘了配对会怎样
压了两次却只弹一次。⚠️ 程序不会报错,把「栈上还剩几个」和「弹出来的是不是最先压进去的那个」都打出来。
阅读更多 →
两层嵌套调用,栈上有几个帧
A 调用 B,B 又调用 C。在 C 的最深处,栈上有几个返回地址?返回之后又剩几个?
阅读更多 →
自己写:call 和 ret
补全 call(把返回地址压栈再跳走)和 ret(弹出返回地址跳回去)。
阅读更多 →
自己写:push 和 pop
补全 push(把寄存器的值压上栈)和 pop(弹回寄存器)。
阅读更多 →
push 和 pop 换了什么
运行下面这段程序,填写它打印出来的结果。 def run(src, regs=None, guard=200): R = {"eax": 0, "ebx"
阅读更多 →
栈帧是什么
一个「栈帧」指的是【0】。
阅读更多 →