我想在汇编中创建一个计算器,它采用算术表达式并输出结果。
类似的东西:
((3 +7) * 21) - (45 -99)
然后我想我需要两个堆栈:一个用于推送数字,另一个用于推动左括号。
然而我搜索并没有结果。回答类似问题的人认为这是一个坏主意,因为它有内置堆栈。
所以我的问题是:使用另一个堆栈是个坏主意吗?如果是,那么实现这一目标的好方法是什么。谢谢
答案 0 :(得分:0)
如果你可以拥有有限堆栈,你可以更改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
是我们的堆栈头,并且再次全局定义。