C ++ Visual Studio 64bit | сохранить значение регистров - PullRequest
0 голосов
/ 26 января 2020

Я использую обходной путь для перехвата некоторой функции, эта функция сохраняет некоторые переменные в регистрах, чтобы подключить функцию и вернуться к реальному коду после перехвата (и для того, чтобы он работал) Мне нужно сохранить значение в этих регистрах и загрузить их после. В 32-битной версии я просто запустил этот код:

DWORD esireg = 0;
DWORD eaxreg = 0;
__asm
{
    mov esireg, esi
    mov eaxreg, eax
}

, теперь мой код запускается, и после того, как я закончу, я загружаю регистры.

__asm
{
    mov esi, esireg
    mov eax, eaxreg
}

Моя проблема заключается в том, что в 64-битном в визуальном после небольшого поиска в google нет встроенной сборки, у кого-нибудь есть идеи, как мне сохранить значение регистров и после этой записи туда?

Я пытался создать внешний файл asm, как в этом видео: https://www.youtube.com/watch?v=XqZCkYr1FB8

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

savereg proc
    mov esireg, esi
savereg endp

, он говорит: "неопределенный символ esireg "

есть идеи, ребята?

1 Ответ

1 голос
/ 26 января 2020

Вы уже обнаружили, что вам нужен отдельный источник для кода сборки. Если вы хотите сохранить регистры, вы можете сохранить их в глобальных переменных, объявленных либо в исходном файле сборки, либо в исходном файле C ++. Если переменные объявлены в исходном файле C ++, то они должны будут опубликовать c в файле C ++ и объявлены как «extrn» в исходном файле сборки. Пример, в котором данные сохраняются в файле сборки:

        .data
raxreg  dq      0
rsireg  dq      0

        .code
;       ...
        mov     raxreg,rax
        mov     rsireg,rsi
;       ...
        mov     rax,raxreg
        mov     rsi,rsireg

Чтобы включить файл сборки в сборку, вам потребуется определить пользовательский шаг сборки. Щелкните правой кнопкой мыши имя исходного файла сборки, затем свойства. Отключите «исключено из сборки», затем определите пользовательский шаг сборки. Для отладочной сборки используйте:

command line: ml64 /c /Zi /Fo$(OutDir)\examplea.obj examplea.asm
outputs:      $(OutDir)\examplea.obj

Для релизной сборки / Zi не используется:

command line: ml64 /c /Fo$(OutDir)\examplea.obj examplea.asm
outputs:      $(OutDir)\examplea.obj
...