Assembly 将寄存器与堆栈顶部的项进行比较?
是否可以在不首先弹出寄存器的情况下,将寄存器与堆栈顶部的项进行比较 这样我可以做,但我必须先弹出值:Assembly 将寄存器与堆栈顶部的项进行比较?,assembly,x86-16,Assembly,X86 16,是否可以在不首先弹出寄存器的情况下,将寄存器与堆栈顶部的项进行比较 这样我可以做,但我必须先弹出值: push 1 pop ax cmp ax,1 jz equal 是否可以在不修改堆栈的情况下执行此操作?如果您具体谈论的是8086(而不是x86系列),则不可以,我不认为存在使用堆栈指针的非直接寄存器模式 基本选择是: [BX] [SI] <displacement> or or [BP] [DI] 或
push 1
pop ax
cmp ax,1
jz equal
是否可以在不修改堆栈的情况下执行此操作?如果您具体谈论的是8086(而不是x86系列),则不可以,我不认为存在使用堆栈指针的非直接寄存器模式 基本选择是:
[BX] [SI]
<displacement> or or
[BP] [DI]
或者,如果您不介意在很短的时间内更改堆栈(但请注意,如果中断可能会导致您出现问题,它们可能会在pop
和push
之间触发):
在任何asm exe的一开始,您就声明一个内存块来记录堆栈的顶部
STAK dw[0]
并使用bx存储堆栈顶部的sp
mov bx,STAK
mov [bx],sp
然后在需要比较时使用bx与任何寄存器进行比较,bx是一个定点寄存器
mov bx,[STAK]
cmp ax,[bx]
如果在32位保护模式下使用x86系列处理器(80386及以上),则可以使用bp而不是bx。如果在不使用PUSH或POP的情况下将堆栈顶部与AX进行比较,这非常容易,因为所有通用寄存器都可以用作基索引
CMP AX, [ESP] ; compare top of stack with AX
CMP EAX, [ESP] ; compare top of stack with EAX
根据IA32指令集参考手册中的“表2-1.16位带ModR/M字节的寻址形式”,可以使用以下组合
[BX] + displacment
[BP] + displacement
[SI] + displacement
[DI] + displacement
[BX + SI] + displacement
[BX + DI] + displacement
[BP + SI] + displacement
[BP + DI] + displacement
不幸的是,在16位模式下(例如在8086上),使用堆栈寄存器不是其中之一。这意味着要在不使用PUSH或POP的情况下访问堆栈顶部,必须首先将SP寄存器的内容移动到BX、BP、SI或DI,然后使用其中一个寄存器访问堆栈上的顶部元素
你必须意识到有几个陷阱。您必须确保寄存器的默认段寄存器与堆栈段寄存器SS匹配,或者必须显式强制在寄存器中使用特定段寄存器。我已经有相当一段时间没有做任何16位编码了,所以现在我对其中的一些规则一无所知。手册中肯定会包含它们
默认情况下,BP寄存器使用堆栈段SS。它还用于在例程内创建堆栈帧,并用于索引以获取在堆栈上传递的参数以及本地堆栈变量
PUSH BP ; These two lines are often used to create the stack
MOV BP, SP ; at the start of a routine
SUB SP, # ; Carve space on the stack for local stack variables
典型的堆栈帧可能看起来像
[BP + 6] ; 16-bit parameter
[BP + 4] ; 16-bit parameter
[BP + 2] ; return address IP saved on stack
[BP + 0] ; saved BP on stack
[BP - 2] ; 16-bit local variable on the stack
[BP - 4] ; 16-bit local variable on the stack
希望这有帮助
PUSH BP ; These two lines are often used to create the stack
MOV BP, SP ; at the start of a routine
SUB SP, # ; Carve space on the stack for local stack variables
[BP + 6] ; 16-bit parameter
[BP + 4] ; 16-bit parameter
[BP + 2] ; return address IP saved on stack
[BP + 0] ; saved BP on stack
[BP - 2] ; 16-bit local variable on the stack
[BP - 4] ; 16-bit local variable on the stack