我想在 LLVM 程序集中实现推送和弹出操作。
alloca 指令不遵循堆栈、推送和弹出的概念。
例子:
推
x86
subl $4, %esp
movl %eax, 0(%esp)
或者
pushl %eax
mips
addi $sp, $sp, -4
sw $t2, 0($sp)
流行音乐
x86
movl 0(%esp), %eax
addl $4, %esp
或者
popl %eax
mips
lw $t2, 0($sp)
addi $sp, $sp, 4
编辑1:
我需要一个独立于平台的解决方案。
首先
我想用栈顶来存储临时对象。
表达式“a*b + c*d + e*f”需要存储三个乘法的结果,操作数是一个类的大对象,运算符是重载的。运算“a*b”需要很多指令,“a”和“b”在乘法过程中不能修改,这意味着“a*b”产生的对象不能使用“a”的相同内存位置或“乙”。
在假设语言的代码中,
call_function( &Object(), &(a + b) );
“&Object()”会在栈上创建一个对象并获取它的指针,指针是函数的参数,函数返回后对象会被删除。
其次
,我想优化递归函数。我想将递归函数转换为迭代函数并使用堆栈来推送稍后将使用的数据。我不能使用数组,因为我不知道堆栈上的最大递归调用数。