首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NASM:如何在汇编语言中实现堆栈

NASM:如何在汇编语言中实现堆栈
EN

Stack Overflow用户
提问于 2015-02-25 12:42:17
回答 1查看 318关注 0票数 1

我想用汇编语言做一个计算器,它接受一个算术表达式并输出结果。

类似于:

代码语言:javascript
运行
复制
((3 +7) * 21) - (45 -99)

然后我想我需要两个栈:一个用来压入数字,另一个用来压入左括号。

然而,我到处寻找,没有任何结果。回答类似问题的人认为这是一个坏主意,因为有内置堆栈。

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

EN

回答 1

Stack Overflow用户

发布于 2015-02-25 14:55:14

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

如果你必须有无限堆栈,你必须使用链表,在linux中你必须使用类似br()系统调用的东西来预留堆中的空间,或者你可以使用C库函数malloc()来为你做这件事。

这是GAS语法中有限堆栈的一个简单实现(由GCC从C源代码生成)

代码语言:javascript
运行
复制
    .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是我们的堆栈头,又是全局定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28711278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档