【问题标题】:Reading off the stack in 8086 Assembly (16 bit mode)在 8086 汇编中读取堆栈(16 位模式)
【发布时间】:2018-10-20 13:06:46
【问题描述】:

我希望能够使用普通的 ASM 功能将一些值推送到堆栈中......

例如

push ax
push bx
push cx
push dx

我想使用堆栈帧以任何顺序访问这些。

假设我想按 C、B、A、D 的顺序弹出这些内容,而不仅仅是必须这样做......

pop dx
pop cx
pop bx
pop ax

使用 SP/BP 执行此操作的最佳/最有效方法是什么,以便我可以在需要时抓取东西,而不必在每次使用初始 4 AX 到 DX 值时不断推动和弹出?

【问题讨论】:

    标签: assembly x86-16


    【解决方案1】:

    在真正的8086的情况下,不能使用SP作为基址寄存器,只能使用BP,所以需要将SP复制到BP,然后使用BP +/- offset作为基于堆栈的变量的地址,比如

            push    bp
            mov     bp,sp
            push    ax          ;[bp-2]
            push    bx          ;[bp-4]
            push    cx          ;[bp-6]
            push    dx          ;[bp-8]
            ...
            mov     ax,[bp-4]   ;ax = pushed value from bx
            ...
            mov     sp,bp       ;restore sp
            pop     bp          ;restore bp
    

    【讨论】:

    • 在 80186 上,出于代码大小的原因,您肯定希望使用 leave 而不是 mov sp,bp / pop bp。 (而且它在现代 x86 上仍然相当有效)。但是真正的 8086 没有那个指令 (posix.nl/linuxassembly/nasmdochtml/nasmdoca.html),所以是的,这是一个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多