首页
社区
课程
招聘
[求助]一个自定义宏错误与__LINE__相关
发表于: 2009-8-31 14:44 4626

[求助]一个自定义宏错误与__LINE__相关

2009-8-31 14:44
4626
#include <windows.h>
#include <stdio.h>       

#define  MyPUSH(x)  __asm  push (x & 0xF7)  
//#define  MyPUSH(x)  __asm  push (x)   这样可以通过 (1)  

int main ()
{
        printf ("%d\n",__LINE__);       
        MyPUSH(__LINE__);               //MyPUSH(123);   这样也可以通过(2)
        return 0;
};

//error C2425: 'AND' : non-constant expression in 'first operand'

第一个操作数不是常数

编译通过 (1)   在define中 不能进行运算吗?不对吧
编译通过 (2)   在define中 运入常数后,也能进行运算

__LINE__  是被看成非常数吗?

这个问题怎么解决?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
push指令只能是一个 操作数 或者寄存器  你加了AND操作 就不是一条指令了
2009-9-1 18:35
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
#define  MyPUSH(x)  __asm  

{
push x
and     dword ptr [esp], 0F7h
}
试下 不确定正确
2009-9-1 18:37
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#include <windows.h>
#include <stdio.h>       

#define  MyPUSH(x)  __asm  push (0xF7 & x)  
//#define  MyPUSH(x)  __asm  push (x)   这样可以通过  

int main ()
{
        printf ("%d\n",__LINE__);       
        //MyPUSH(__LINE__);               
        MyPUSH(123);   //这样也可以通过
        return 0;
};
//我这种方式能够编译通过 传过去123  在PUSH里进行一次与运算
2009-9-2 10:20
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=mmhkh;679904]#define  MyPUSH(x)  __asm  

{
push x
and     dword ptr [esp], 0F7h
}
试下 不确定正确[/QUOTE]

不行  很多错误~而且我要求只能是一条PUSH指令 这样就多出来一条指令了呀
2009-9-2 10:26
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
6
显然__LINE__是非常数。
在 push 指令里不能进行与运算,MyPush(123)是在编译时算出来的:

        __asm  push 123 & 0xF7
004113C9 6A 73            push        73h
2009-9-2 10:38
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这与编辑器的实现有关, 如果是VC++, 错误在Release版应是不存在的, Debug版中将调试信息格式修改为Program Database, 应该也是可以的。
2009-9-2 22:14
0
游客
登录 | 注册 方可回帖
返回
//