我想用汇编语言做一个计算器,它接受一个算术表达式并输出结果。
类似于:
((3 +7) * 21) - (45 -99)然后我想我需要两个栈:一个用来压入数字,另一个用来压入左括号。
然而,我到处寻找,没有任何结果。回答类似问题的人认为这是一个坏主意,因为有内置堆栈。
所以我的问题是:使用另一个堆栈是个坏主意吗?如果是,什么是实现这一点的好方法。谢谢
发布于 2015-02-25 14:55:14
如果你可以有一个有限的堆栈,你可以改变rbp和rsp,在堆栈中保留一些空间,然后你可以像数组一样使用它,或者使用一些全局分配的数组,而不是在堆栈中保留空间
如果你必须有无限堆栈,你必须使用链表,在linux中你必须使用类似br()系统调用的东西来预留堆中的空间,或者你可以使用C库函数malloc()来为你做这件事。
这是GAS语法中有限堆栈的一个简单实现(由GCC从C源代码生成)
.local S
.comm S,4096,32
.local head
.comm head,4,4
.text
.globl push
push:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
movl head(%rip), %eax
cmpl $1023, %eax
jg .L1
movl head(%rip), %eax
cltq
movl -4(%rbp), %edx
movl %edx, S(,%rax,4)
movl head(%rip), %eax
addl $1, %eax
movl %eax, head(%rip)
.L1:
popq %rbp
ret
.LFE0:
.globl pop
pop:
.LFB1:
pushq %rbp
movq %rsp, %rbp
movl head(%rip), %eax
testl %eax, %eax
jle .L4
movl head(%rip), %eax
subl $1, %eax
movl %eax, head(%rip)
movl head(%rip), %eax
cltq
movl S(,%rax,4), %eax
jmp .L3
.L4:
.L3:
popq %rbp
ret在上面的代码中,S是我们全局定义的堆栈数组,head是我们的堆栈头,又是全局定义的。
https://stackoverflow.com/questions/28711278
复制相似问题