NASM:我如何在汇编中实现堆栈

时间:2015-02-25 04:42:17

标签: assembly stack nasm

我想在汇编中创建一个计算器,它采用算术表达式并输出结果。

类似的东西:

((3 +7) * 21) - (45 -99)

然后我想我需要两个堆栈:一个用于推送数字,另一个用于推动左括号。

然而我搜索并没有结果。回答类似问题的人认为这是一个坏主意,因为它有内置堆栈。

所以我的问题是:使用另一个堆栈是个坏主意吗?如果是,那么实现这一目标的好方法是什么。谢谢

1 个答案:

答案 0 :(得分:0)

如果你可以拥有有限堆栈,你可以更改rbprsp并在堆栈中保留一些空间然后你可以像数组一样使用它,或者你可以使用全局分配的数组而不是在堆栈中保留空间

如果你必须拥有无限堆栈,你必须使用链表,而在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是我们的堆栈头,并且再次全局定义。