在研究浮动电路CPU的过程中,遇到了汇编语言。这是一款运行在CPU内部的汇编语言,它通过栈传递参数和返回值,在栈里,一个单元是一比特。即每次push和pop操作都涉及一比特信息。一个例子如下:
push p6 .. p1
call func,sp-2
pop r1 .. r3
func:
# v1=sp[1], v2=sp[2]
mov r1, sp[6]
mov r2, sp[7]
mov r3, sp[8]
ret, sp+5
调用func前后,栈的变化:
与x86汇编不同,栈在CPU内部,一次操作一比特。ret, sp+5的意思是:返回,顺便sp+5。
需要“顺便”执行的原因,是ret指令内含pop,而pop又内含修改sp,所以,将ret和修改sp的指令写在一行,顺便执行。这样可以省去一句修改sp的指令,速度快了一点点。
图1、call之前
图2、push、call之后
图3、设置返回值r
图4、返回
图5、获取返回值以后,恢复到图1