2013-03-18 4 views
1

Stack:узел указатель стека

0xDDDD 
0xCCCC 
0xBBBB 
0xAAAA 

поп топор Средства:

  • 0xAAAA будет помещен в топор
  • SS: SP будет указывать теперь 0xBBBB.

Теперь я получаю это.

0xDDDD 
0xCCCC 
0xBBBB 

Я хочу сохранить значение оси.

push ax. 

0xDDDD 
0xCCCC 
0xBBBB 
0xAAAA 

Здесь я снова иду.

mov ax, [ss:sp+2] 

0xBBBB будет загружен в топор.

После выполнения моей функции я хочу удалить как стек, так и 0xAAAA и 0xBBBB из стека. Во-первых, я восстановлю топор.

pop ax. (Now loaded with 0xAAAA) 

Как избавиться от 0xBBBB от моего стека? Я просто «поп» без аргументов (это существует?) Или я могу добавить sp, 2?

спасибо.

+4

Загрузить руководства по процессорам от Intel или AMD. Они скажут вам, существует ли «поп» без операндов, что «add sp, 2» будет делать и есть ли какая-либо другая ошибка в инструкциях из вопроса. –

+0

'mov ax, [ss: sp + 2]' не существует и не собирается. 'pop' без аргументов также не существует в сборке x86 и не собирается, используйте для этого' add sp, 2'. 'pop' сам не очищает значения, выпадающие из стека, но обычно они быстро перезаписываются очередным прерыванием. – nrz

ответ

1

Просто отрегулируйте указатель стека, чтобы указать ранее в стеке, как с add sp, $2. Синтаксис может варьироваться в зависимости от того, какой ассемблер вы используете. $2 предназначен для обозначения «немедленного значения 2».

Вы можете скачать Intel 64 and IA-32 Architectures Software Developer’s Manuals.

(Обратите внимание, что использование 16-разрядных регистров является довольно старым. В зависимости от того, на какой платформе вы пишете, могут потребоваться требования к тому, чтобы выравнивание стека было кратным четырем байтам или более, особенно при вызове или возврате из подпрограмм.)

Смежные вопросы