如何在程序集中保存esi或edi



我正在执行几个已经需要使用源索引的进程。如果我需要使用已经用于另一项的源索引,我该怎么做?是否有一种方法可以将edi保存为数据,然后在必要时检索它?

谢谢。

一种常见的方法是使用CPU堆栈:

push esi
; ... do whatever needs esi
pop  esi

如果在pushpop之间有任何跳转到其他地方的东西,您必须确保堆栈被适当地清理。

堆栈是为这个:

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

最新更新