2014-11-27 1 views
0

У меня есть декомпилированная функция и вы хотите скомпилировать ее источник. Проблема с заявлениями LoByte: прибудете «ошибка: именующее требуется в качестве левого операнда назначения» на каждой строке, например, что:Как заставить gcc/g ++ принимать выражения типа LOBYTE (v15) = someExpression?

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

Tip обходной путь, пожалуйста.

+0

Как мы могли бы узнать, что такое 'LOBYTE'? –

+0

В частности, он может быть наименее значимыми битами v9 или байтом с наименьшим адресом. В системах с большими концами они находятся на противоположных концах. – MSalters

ответ

3

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

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

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

0

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

5 = 2 * 3

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

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


EDIT:

Что касается «как решить» часть [извините за пропуск в первый ответ], вы должны предоставить именующее выражение как результат LoByte.

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

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

для получения требуемого именующего выражения.

+0

@MattMcNabb Извините, сэр, не понял. Не могли бы вы немного разобраться? –

+0

использовать переменную слева от знака равенства, вам нужно, чтобы оно было lvalue –

+0

@MattMcNabb Ithink Я использовал слова воодушевляющие !!! проверьте изменения. –

Смежные вопросы