Вопрос Как сохранить регистр в переменную | ASM

Начинающий
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
132
Реакции[?]
11
Поинты[?]
6K
Попытался сам, но почему-то вывод 0 в логе
Глобальная переменная DWORD dynamicEax;

C++:
__declspec(naked) void Codecave() {
    __asm {
        //pushad
        mov dynamicEax, eax
        //popad
        fld dword ptr ds : [eax]
        mov edx, [eax + 4]
        jmp [returnAddress]
    }
}


void LogCoordinates() {
    char logMessage[256];
    snprintf(logMessage, sizeof(logMessage), "dynamicEax: 0x%08X", dynamicEax);
    Log(logMessage);

    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
ПРИ ЭТОМ, если написать так, то игра крашнет и лог отобразит это:
Error: dynamicEax is null.
in Codecave dynamicEax: 0x52A38C1C​

C++:
__declspec(naked) void Codecave() {

    __asm {

        //pushad

        mov dynamicEax, eax

        //popad

    }



    char logMessage[256];

    snprintf(logMessage, sizeof(logMessage), "in Codecave dynamicEax: 0x%08X", dynamicEax);

    Log(logMessage);



    __asm {

        fld dword ptr ds : [eax]

        mov edx, [eax + 4]

        jmp[returnAddress]

    }


void LogCoordinates() {
    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    char logMessage[256];
    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
ОТВЕТ: хуй знает, у меня при нажатии кнопки1 вызывалась сначала Codecave, а сразу после LogCoordinates, удалил LogCoordinates и создал кнопку2 с таким же функционалом как и LogCoordinates, но теперь всё отображает.
Мб нужно было завершиться функции кнопки1, чтобы регистр eax записал значение в dynamicEax, хз
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
28 Сен 2024
Сообщения
16
Реакции[?]
1
Поинты[?]
1K
Попытался сам, но почему-то вывод 0 в логе
Глобальная переменная DWORD dynamicEax;

C++:
__declspec(naked) void Codecave() {
    __asm {
        //pushad
        mov dynamicEax, eax
        //popad
        fld dword ptr ds : [eax]
        mov edx, [eax + 4]
        jmp [returnAddress]
    }
}

C++:
void LogCoordinates() {
    char logMessage[256];
    snprintf(logMessage, sizeof(logMessage), "dynamicEax: 0x%08X", dynamicEax);
    Log(logMessage);

    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
ПРИ ЭТОМ, если написать так, то игра крашнет и лог отобразит это:
Error: dynamicEax is null.
in Codecave dynamicEax: 0x52A38C1C​

C++:
__declspec(naked) void Codecave() {

    __asm {

        //pushad

        mov dynamicEax, eax

        //popad

    }



    char logMessage[256];

    snprintf(logMessage, sizeof(logMessage), "in Codecave dynamicEax: 0x%08X", dynamicEax);

    Log(logMessage);



    __asm {

        fld dword ptr ds : [eax]

        mov edx, [eax + 4]

        jmp[returnAddress]

    }

C++:
void LogCoordinates() {
    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    char logMessage[256];
    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
C++:
__declspec(naked) void Codecave() {
    __asm {
        mov dynamicEax, eax
        
        fld dword ptr [eax]
        mov edx, [eax + 4]
        
        jmp [returnAddress]
    }
}

void LogCoordinates() {
    char logMessage[256];

    snprintf(logMessage, sizeof(logMessage), "dynamicEax: 0x%08X", dynamicEax);
    Log(logMessage);

    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
 
Начинающий
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
132
Реакции[?]
11
Поинты[?]
6K
C++:
__declspec(naked) void Codecave() {
    __asm {
        mov dynamicEax, eax
       
        fld dword ptr [eax]
        mov edx, [eax + 4]
       
        jmp [returnAddress]
    }
}

void LogCoordinates() {
    char logMessage[256];

    snprintf(logMessage, sizeof(logMessage), "dynamicEax: 0x%08X", dynamicEax);
    Log(logMessage);

    if (!dynamicEax) {
        Log("Error: dynamicEax is null.");
        return;
    }

    Vector3* coords = (Vector3*)dynamicEax;

    snprintf(logMessage, sizeof(logMessage), "Coordinates: X = %f, Y = %f, Z = %f", coords->x, coords->y, coords->z);
    Log(logMessage);
}
Что?
 
Начинающий
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
132
Реакции[?]
11
Поинты[?]
6K
Возможное решение твоей проблемы
а что ты изменил? Я не вдупляю
upd. убрал указание сегмента? Не думаю, что это решит мою проблему с сохранением eax в переменную, но спасибо, проверю
 
Последнее редактирование:
Сверху Снизу