Прохождение стека со встроенным ассемблером для VC ++ - PullRequest
0 голосов
/ 31 декабря 2010

Я вставил следующий код asm в мой код C ++. Я использую компилятор VC ++.

char c;
curr_stack_return_addr = s.AddrFrame.Offset; //I am doing a stack walk
    __asm{  
            push bx
            mov eax, curr_stack_return_addr  
            mov bl, BYTE PTR [eax - 1]
            mov c,bl
            pop bx

     }

Я получаю правильное значение в c для своих функций, но оно падает, когда достигает системных функций в стеке. Я не получаю ошибок компилятора. Что я сделал не так?

Решено: Я забыл проверить конец стека! Обратный адрес в последнем кадре равен 0. Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

Я вижу две проблемы здесь:

  1. push bl и pop bl не существует. Вы можете только толкать и высовывать слова или мечи. Кстати, компилятор предупреждает.

  2. Откуда вы знаете, что eax указывает на юридический адрес?

3 голосов
/ 31 декабря 2010

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

...