Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将寄存器与堆栈顶部的项进行比较?_Assembly_X86 16 - Fatal编程技术网

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