Assembly 汇编语言&x2B;在寄存器之间移动值

Assembly 汇编语言&x2B;在寄存器之间移动值,assembly,x86,Assembly,X86,我有一个关于X-86或IA32汇编语言的问题(不确定我的教科书中是否有相同的语言可以互换使用),我有下面的代码来执行下面的操作 将%ebp的当前值(堆栈地址)移动到寄存器中,将0x20添加到寄存器中,然后将结果存储在%ebp的当前值中。这是我的代码,基本上它计算上一个堆栈帧的帧指针,通过使用GDB的实际计算,它是%ebp+0x20。谁能告诉我我错过了什么 movl %ebp, %edx //move the "stack address" of %ebp into the register

我有一个关于X-86或IA32汇编语言的问题(不确定我的教科书中是否有相同的语言可以互换使用),我有下面的代码来执行下面的操作

%ebp
的当前值(堆栈地址)移动到寄存器中,将
0x20
添加到寄存器中,然后将结果存储在
%ebp
的当前值中。这是我的代码,基本上它计算上一个堆栈帧的帧指针,通过使用GDB的实际计算,它是
%ebp+0x20
。谁能告诉我我错过了什么

movl %ebp, %edx   //move the "stack address" of %ebp into the register
addl $0x20, %edx  // add 0x20 to the value in %edx which is actually the address of the stack of %ebp
movl %edx, (%ebp) //overwrite the contents of %ebp with our calculated values from the previous 2 steps
另外,当我说“堆栈地址”时,我不是指堆栈指针。我指的是堆栈上该位置的内存地址,而不是其中包含的值(如果有意义的话)

第一行,将ebp的32位值移动到edx,您声明它是堆栈地址,它不是,但可以是,这意味着,只有将esp的值放入其中,ebp才能指向堆栈地址

第二行将0x20添加到edx,edx被总和覆盖,更像C中的edx=edx+0x20


第三行将总和从前一行移动到EBP指向的32位内存地址,因此无论EBP指向的内存位置的值是什么,它都会被EDX的32位值覆盖。就这样

堆栈地址位于
%esp
stach指针中,而不是
%ebp
基点。它似乎是正确的。您遇到了什么问题?基本上,我的程序只是出现了我假设的故障,因为计算的执行方式与我认为我的代码的执行方式不同。请您在使用寄存器之前保存/恢复它们?
movl%edx,(%ebp)//覆盖%ebp的内容。这一评论是错误的。您正在覆盖由
%ebp
指向的内存。不管怎么说,投票被否决是因为完全不清楚。不知道OP试图对调用方保存的
%ebp
地址做什么,也不知道他们希望通过将该值存储到
(%ebp)
(该值在使用ebp作为帧指针的函数中保存此堆栈帧的保存的
%ebp
值,即调用方的ebp来完成什么。)
movl %ebp, %edx   
addl $0x20, %edx  
movl %edx, (%ebp)