восстановить предыдущее значение сборки? - PullRequest
0 голосов
/ 14 марта 2012

Я хочу посмотреть, каково предыдущее значение 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, как я могу сделать это в сборке?

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

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

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

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

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

0 голосов
/ 14 марта 2012

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

PUSH  EAX 

instedad

PUSHAD

Командой POSHAD является противоположная команда POPAD, в которой можно сохранить или восстановить 8 регистров в / из стека.

Вы можете использоватьтакже 8 поп инструкция по восстановлению стека после 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
0 голосов
/ 14 марта 2012

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

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