Assembly 将另一个寄存器移动到EBP寄存器
我理解EBP和ESP寄存器的基本语义,但我对以下内容有点困惑:Assembly 将另一个寄存器移动到EBP寄存器,assembly,x86,Assembly,X86,我理解EBP和ESP寄存器的基本语义,但我对以下内容有点困惑: mov ebp, eax 下一行是: mov edi, dword ptr [ebp] 我认为ebp寄存器是我们遍历堆栈的参考点,向它添加参数,减去得到局部变量。所以,通过将eax移动到ebp,这不会导致问题吗 我可以说: mov [ebp+12], eax 我猜这是沿着将eax移动到out参数的路线进行的?如果不看到更多代码,就不可能知道使用这些指令访问哪些实体 x86 CPU中没有任何东西阻止您使用ebp进行访问子程序参数
mov ebp, eax
下一行是:
mov edi, dword ptr [ebp]
我认为ebp寄存器是我们遍历堆栈的参考点,向它添加参数,减去得到局部变量。所以,通过将eax移动到ebp,这不会导致问题吗
我可以说:
mov [ebp+12], eax
我猜这是沿着将eax移动到out参数的路线进行的?如果不看到更多代码,就不可能知道使用这些指令访问哪些实体 x86 CPU中没有任何东西阻止您使用
ebp
进行访问子程序参数和局部变量以外的操作
在32位模式下,您也可以通过esp
访问堆栈上的变量,因为[esp+something]
有内存操作数编码。在16位模式下,无法使用sp
执行此操作,需要使用以下列表中的一个寄存器:bp
,bx
,si
,di
有些编译器可以选择使用[esp+something]
而不是[ebp+something]
来访问堆栈上的数据。这为您购买了一个额外的通用寄存器,您可以将其用于其他用途
只要您的代码不需要保留
ebp
的值,或者只要它将ebp
恢复到预期值,那么执行mov ebp,eax
操作就不会发生任何不好的事情,在没有看到更多代码的情况下,不可能判断使用这些指令访问哪些实体
x86 CPU中没有任何东西阻止您使用ebp
进行访问子程序参数和局部变量以外的操作
在32位模式下,您也可以通过esp
访问堆栈上的变量,因为[esp+something]
有内存操作数编码。在16位模式下,无法使用sp
执行此操作,需要使用以下列表中的一个寄存器:bp
,bx
,si
,di
有些编译器可以选择使用[esp+something]
而不是[ebp+something]
来访问堆栈上的数据。这为您购买了一个额外的通用寄存器,您可以将其用于其他用途
只要您的代码不需要保留ebp
的值,或者只要它将ebp
恢复到预期值,执行mov ebp,eax
就不会发生任何不好的事情