我正在执行几个已经需要使用源索引的进程。如果我需要使用已经用于另一项的源索引,我该怎么做?是否有一种方法可以将edi保存为数据,然后在必要时检索它?
谢谢。
一种常见的方法是使用CPU堆栈:
push esi
; ... do whatever needs esi
pop esi
如果在push
和pop
之间有任何跳转到其他地方的东西,您必须确保堆栈被适当地清理。
堆栈是为这个:
push %esi
push %edi
...
...
...
pop %edi
pop %esi
一定要注意顺序。另外,请使用相应版本的push
/pop
。
如果你需要同时保存和访问不同的值,创建自己的stackframe是一个更好的解决方案。
示例(在函数开头,AT&T语法):
push %ebp // save the old ebp
mov %esp, %ebp // ebp now points to the top of the stack
sub X, %ebp // reserve X bytes for the current function
现在你可以引用%ebp中的内存位置,例如:
movl $1, -4(%ebp) // moves constant 1 to the first free location
movl $1, -8(%ebp) // moves constant 1 to the next free location
addl -4(%ebp), -8(%ebp) // add -4(%ebp) and -8(%ebp) together and write in -8(%ebp)
同样,您可以将第一个变量保存在-4(%ebp)中,将第二个变量保存在-8(%ebp)中。
销毁stackframe并返回:
movl %ebp, %esp
popl %ebp
ret
您不需要清除内存,因为一旦再次使用该空间,它将被覆盖。
push edi
; ... code that uses edi
pop edi