【问题标题】:How to make gcc/g++ accept expressions like LOBYTE(v15) = someExpression?如何让 gcc/g++ 接受像 LOBYTE(v15) = someExpression 这样的表达式?
【发布时间】:2014-11-27 07:20:16
【问题描述】:

我有一个反编译的函数,想编译它的源代码。问题在于 LOBYTE 语句: 像这样在每一行上得到“错误:左值需要作为赋值的左操作数”:

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

请提供解决方法。

【问题讨论】:

  • 我们怎么可能知道LOBYTE 是什么?
  • 特别是,它合理地可能是 v9 的最低有效位,或具有最低地址的字节。在大端系统上,它们处于相反的两端。

标签: c++ c gcc g++


【解决方案1】:

假设v9 是算术类型的对象(问题没有明确说明所涉及的不同标识符/宏的声明)并且系统是小端:

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

将允许LOBYTE 位于= 运算符的左侧。

【讨论】:

    【解决方案2】:

    我不认为LOBYTE 是一个变量,你可以在其中存储一些价值。这是一个MACRO,它本身返回一个值。实际上,您正在编写类似于[预处理后]的内容

    5 = 2 * 3

    这是不可能的。您将需要在赋值 = 运算符的 LHS 上有一些 可写 内存。

    在您的情况下,LOBYTE 的可能实现是#define LOBYTE(x) ((unsigned char) ((x) & 0xff)),而不是lvalue。这就是错误存在的原因。


    编辑:

    关于“如何解决”部分[抱歉在第一个答案中遗漏],您需要提供左值作为 LOBYTE 的结果。

    只是添加到ouah 的答案,你可以做类似的事情

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

    产生所需的左值。

    【讨论】:

    • @MattMcNabb 对不起,先生,没有明白你的意思。你能详细说明一下吗?
    • 要使用等号左边的变量,你需要它是一个左值
    • @LưuVĩnhPhúc 先生,谢谢您的解释。但是,我想展示 LOBYTE 的特定实现,这可能会导致 OP 的错误。在那种情况下,我说的对吗?
    • 这不是您最初的措辞。不要叫我先生
    • @LưuVĩnhPhúc 如你所愿!根据最新的编辑,我的答案是正确的,对吧?
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多