Как заставить gcc / g ++ принимать такие выражения, как LOBYTE (v15) = someExpression?

0

У меня есть декомпилированная функция и вы хотите скомпилировать ее источник. Проблема заключается в операторах LOBYTE: получить "error: lvalue, требуемый как левый операнд присваивания" в каждой строке:

LOBYTE(v9) = ((_BYTE)v12 + (v7 ^ v13)) & 0x1F;

Подскажите обходной путь, пожалуйста.

  • 0
    Как бы мы узнали, что такое LOBYTE ?
  • 0
    В частности, это могут быть младшие значащие биты v9 или байт с самым низким адресом. В системах с прямым порядком байтов они находятся на противоположных концах.
Теги:
gcc
g++

2 ответа

3
Лучший ответ

Предполагая, что v9 является объектом арифметического типа (вопрос не содержит явных заявлений о различных идентификаторах/макросах), а система малозначна:

#define LOBYTE(x)  (*(unsigned char *) &(x))

позволит LOBYTE в левой части оператора =.

0

Я не думаю, что LOBYTE - это какая-то переменная, в которой вы можете получить некоторое значение. Это MACRO который возвращает само значение. В effet вы пишете что-то похожее на [после предварительной обработки]

5 = 2 * 3

что невозможно. Вам понадобится записываемая память на LHS оператора присваивания =.

В вашем случае возможная реализация LOBYTE: #define LOBYTE(x) ((unsigned char) ((x) & 0xff)), которая не является значением lvalue. Вот почему ошибка есть.


РЕДАКТИРОВАТЬ:

Что касается "как решить" часть [извините за отсутствие в первом ответе], вам необходимо предоставить lvalue в качестве результата LOBYTE.

Чтобы добавить к ответу ouah, вы можете сделать что-то вроде

#define LOBYTE(x)  (*(uint8_t *) &(x))

для получения требуемого значения l.

  • 0
    @MattMcNabb Извините, сэр, не понял вашу точку зрения. Можете ли вы уточнить немного?
  • 0
    чтобы использовать переменную слева от знака равенства, нужно, чтобы она была lvalue
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню