Как сохранить ESI или EDI в сборке - PullRequest
2 голосов
/ 09 октября 2011

Я выполняю несколько процессов, которые уже требуют использования исходного индекса. Если мне нужно использовать исходный индекс, который уже используется для другого элемента, как я могу это сделать? Есть ли способ сохранить edi как данные, а затем извлечь их при необходимости?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Обычный способ сделать это - использовать стек ЦП:

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

Если между push и pop что-то прыгает в другом месте, вам нужно убедиться, что стек очищен соответствующим образом.

2 голосов
/ 09 октября 2011

стек для этого:

push %esi
push %edi
...
...
...
pop %edi
pop %esi

Всегда обращайте внимание на заказ. Также используйте соответствующую версию push / pop.

Если вам нужно одновременно сохранить и получить доступ к различным значениям, лучшим решением будет создание собственного стекового кадра.

Пример (в начале функции, синтаксис 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).

Для уничтожения стекового кадра и возврата:

movl %ebp, %esp
popl %ebp
ret

Вам не нужно очищать память, так как она будет перезаписана, как только это пространство будет использовано снова.

1 голос
/ 09 октября 2011
push edi

; ... code that uses edi

pop edi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...