Assembly 在8086汇编中读取堆栈(16位模式)
我希望能够使用正常的ASM功能将一些值推送到堆栈中 e、 g 我想使用堆栈框架以任何顺序访问这些文件 让我们假设我想按C,B,A,D的顺序弹出这些,而不是仅仅做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+/-偏移量作为基于堆栈的变量的
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没有该指令(),所以是的,这是一个很好的例子。