проверить стек в сборке

Я нажимаю некоторое значение int во встроенной сборке:

_asm
  {
  mov eax,i3  
  push eax
  mov eax,ii  
  }  

Позже я получаю это значение, делая всплывающие окна:

_asm
  {
  pop eax
  mov ii,eax  
  pop eax
  mov i3,eax  
  }  

Что я хотел бы проверить свой стек, не делая pop. Мне нужно переставить или пересмотреть несколько значений. Затем я могу восстановить стек, когда закончу.

Я очень ржавый в asm. Есть ли что-то вроде:

mov ii,esp+4 

который переместит следующий (не текущий) элемент стека? Я просто предполагаю. Мне нужно, чтобы этот код работал как в 32-битной, так и в 64-битной среде.


person user1231247    schedule 21.10.2012    source источник
comment
Используйте окно просмотра памяти отладчика. Но самое главное, просто не пишите такой код. Вместо этого используйте локальную переменную, она также находится в стеке. И отладчик может показать вам значение.   -  person Hans Passant    schedule 21.10.2012


Ответы (1)


Что я хотел бы проверить свой стек, не делая pop. Мне нужно переставить или пересмотреть несколько значений.

Вот как переменные, размещенные в стеке, действуют в функции — поэтому за прологом функции обычно следует sub esp, x, где x — это объем выделяемого пространства.

Следовательно, доступ к переменным в C (и в C++) — это проверка стека. В качестве альтернативы, если вы знаете, как компилятор распределил переменные, вы можете прочитать их из встроенного ASM.

Одним из способов добиться того, что вы пытаетесь сделать, может быть перечисление ваших входных и выходных переменных в качестве операндов для встроенного asm. Эта статья osdev прекрасно объясняет это. Таким образом, независимо от того, как компилятор переупорядочивает стек между изменениями кода и флагами оптимизации, ваш ассемблер все равно будет работать.

В качестве альтернативы, если вы сами пишете всю функцию, вы можете загрузить значение стека по заданному адресу следующим образом:

mov eax, DWORD PTR [ebp-8]

Это загрузит eax со значением адреса памяти, расположенного в ebp-8.

person Community    schedule 21.10.2012
comment
Когда я помещаю что-то в стек. В моем примере я нажимаю eax. В стек добавляется 4-байтовое значение. Будет ли это тот же размер на большинстве систем. Например, при использовании win64 добавляет ли push eax 8-байтовое значение в стек? - person user1231247; 22.10.2012