2012-03-14 3 views
-1

я хочу видеть, что предыдущее значение EAX это и делать, что я использую POP EAX, но тогда, когда я пытаюсь восстановить его с помощью popad его не восстанавливая его значение оно было до того, как я использовал POP EAXвосстановить предыдущее значение сборки?

PUSHAD 
POP EAX <-- Now i see the value i wanted to see to compare the new EAX 
CMP EAX, 1 
JE JMP_TO_SOME_CODE 

//DO STUFF 

POPAD <-- I want to restore eax back to what it was BEFORE i used POP EAX 
RET 

, но когда я делаю выше, он не восстанавливает его обратно к исходному значению EAX, как я могу это сделать в сборке?

+2

С тех пор как вы новичок, я не буду опускать вас вниз, но я настоятельно рекомендую прочитать некоторые уроки об сборке (здесь вы найдете хорошие рекомендации). Задавая такие вопросы, вы не получите слишком далеко - даже если вы получите исчерпывающий ответ, он не решит проблему программирования, с которой вы сталкиваетесь. Лучше будет описывать то, что вы пытаетесь сделать (эта часть отсутствует в вопросе), и не только то, что вы пробовали, потому что то, что вы пытались, скорее всего, основано на неправильных предположениях и непонимании. – hirschhornsalz

ответ

4

То, что вы делаете, на самом деле не имеет никакого смысла. Следующий тип поп-команды сразу после PUSHAD должен быть POPAD, чтобы стек не повреждался (если только вы не выполняете то же количество отдельных POP s, чтобы восстановить указатель стека, как POPAD).

PUSHAD толкает все регистры общего назначения в стек, имеющий один POP потом будут стянуть значение некоторых случайного регистра в из стека и иметь указатель стека, указывающий в недопустимом месте для POPAD быть выполнено.

  • EAX не теряет своей стоимости после того, как его вталкивают в стек.
  • POP EAX не магически заполняет EAX с предыдущим значением.

Если вы хотите сравнить EAX к предыдущему значению, то вы будете нуждаться, чтобы сохранить это значение в другом регистре или в качестве «локальной» переменной в стеке.

+0

Я новичок в сборке, поэтому я не очень хорошо понимаю ваш ответ, как установить локальную переменную в стеке? как это делается? – codrgi

0

Я не использую сборку через некоторое время, но я думаю, что я прав, говоря, что здесь задействован только один стек, поэтому POP удаляет одно из значений, вставляемых в стек PUSHAD, и поэтому, когда вы используйте POPAD, все значения, которые вы перенесли с помощью PUSHAS, будут в одном из других регистров общего назначения. Если this article верен, возможно, ваш EAX находится в ECX?

0

Использование

PUSH EAX 

instedad

PUSHAD 

Инструкция oposite из PUSHAD является POPAD и хранить или восстанавливать 8 регистров в/из стека.

Вы также можете использовать 8 команд pop для восстановления стека после PUSHAD.

mov eax, 123456 
    pushad  //store 8 registers to stack: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 
// 
    pop eax //restore EDI 
    pop eax //restore ESI 
    pop eax //restore EBP 
    pop eax //restore ESP 
    pop eax //restore EBX 
    pop eax //restore EDX 
    pop eax //restore ECX 
    pop eax //restore EAX now the eax register contain start value 123456 
Смежные вопросы