Assembly 在8086汇编中读取堆栈(16位模式)

Assembly 在8086汇编中读取堆栈(16位模式),assembly,x86-16,Assembly,X86 16,我希望能够使用正常的ASM功能将一些值推送到堆栈中 e、 g 我想使用堆栈框架以任何顺序访问这些文件 让我们假设我想按C,B,A,D的顺序弹出这些,而不是仅仅做 pop dx pop cx pop bx pop ax 使用SP/BP实现这一点的最佳/最有效的方法是什么,这样我就可以在需要的时候抓取东西,而不必每次使用初始的4个AX到DX值时都不断地按下和弹出?对于真正的8086,您不能使用SP作为基址寄存器,只能使用BP,因此您需要将SP复制到BP,然后使用BP+/-偏移量作为基于堆栈的变量的

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

e、 g

我想使用堆栈框架以任何顺序访问这些文件

让我们假设我想按C,B,A,D的顺序弹出这些,而不是仅仅做

pop dx
pop cx
pop bx
pop ax

使用SP/BP实现这一点的最佳/最有效的方法是什么,这样我就可以在需要的时候抓取东西,而不必每次使用初始的4个AX到DX值时都不断地按下和弹出?

对于真正的8086,您不能使用SP作为基址寄存器,只能使用BP,因此您需要将SP复制到BP,然后使用BP+/-偏移量作为基于堆栈的变量的地址,例如

        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

对于真正的8086,不能使用SP作为基址寄存器,只能使用BP,因此需要将SP复制到BP,然后使用BP+/-偏移量作为基于堆栈的变量的地址,例如

        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上仍然相当高效)。但true 8086没有该指令(),因此,是的,这是一个很好的示例。在80186上,出于代码大小的原因,您肯定希望使用
leave
而不是
mov sp,bp
/
pop bp
。(在现代x86上仍然相当高效)。但是true 8086没有该指令(),所以是的,这是一个很好的例子。