首页
社区
课程
招聘
[原创]自己归纳的VC编程细节
发表于: 2009-1-16 12:42 45639

[原创]自己归纳的VC编程细节

2009-1-16 12:42
45639

都是一些比较细节的东西,有没有用大家看着办吧。
C/C++技术细节(VC编译器)
1.Jmp stub Function
考虑以下函数:
Void Test(){}
Void main()
{ test();}
在debug情况下,编译后
Void Jmp_Test()
{
    Jmp to Real_test();
}
Void main()
{jmp_test()}
如何让编译器不产生Jmp Stub function。
解决方法,在Link选项中去掉Increment link.

2.自定义节,数据代码合并在一个节
#pragma data_seg(".mydat") //指定该.cpp/.c(其实应该是某个.obj文件) 数据存放的节
注意:Dword a; //  未初始化,数据仍保存在.data节
      Dword a=0; //这样a就保存到.mydat节了
#pragma code_seg(".shell")//指定该.cpp/.c(其实应该是某个.obj文件) 代码存放的节
#pragma comment(linker,"/SECTION:.mydat,RWE") //修改节属性
#pragma comment(linker,"/SECTION:.shell,RWE")
#pragma comment(linker,"/MERGE:.mydat=.shell")//两节合并到.shell节

3.__declspec(naked)声明的函数不能使用局部变量

4.char[]
char test[]=”test”//假定 此处地址为0x4001000
void main()
{
    printf(“%x”,test);
    printf(“%x”,&test);
}//执行以上代码分别输出什么
答案:两个都输出0x4001000,哈哈,没想到吧。

5.char*与char[]
char* test1=”test”;
char test2[]=”test”
考虑下执行该程序会产生什么状况
void main()
{
    test1=”new test”;
    test2=”new test”;
}
考虑下再看答案

编译后是这样的。
atest db ‘test’,0
Test1        dd        offset of attest
Test2 db ‘test’,0
所以test2=”new test”;编译过不了,当然我们仍然能够通过memcpy给test2赋值

6.数据对齐
Word a;
Char str[]=”ddddd”;
Void main()
{
        Printf(”%d”,&str-&a);//输出什么,考虑一下
}
答案:可能输出2,也可能输出4


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (42)
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
哈哈,沙发
2009-1-16 16:54
0
雪    币: 496
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很有意思。
2009-1-18 16:07
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵。。。。。。。
2009-1-18 17:29
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
vc++的编译器的好多东西还是非常有意思的
void test()
{
printf("old esp : 0x08x;\nreturn address : 0x08x");
}
2009-1-18 18:36
0
雪    币: 230
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
版主,能否申请加精。
2009-1-18 19:23
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
首先,感觉楼主分享技术。其次,这个贴子其实我昨天的翻阅过几次,经过慎重思考,将该贴设为优秀贴,这并不是在否定楼主的成果,只是希望楼主往后可以写出更精彩的文章。
2009-1-18 20:03
0
雪    币: 7127
活跃值: (3652)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
方便以后查找学习。
2009-1-19 10:52
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
9
学习到了知识,谢谢分享
2009-1-19 10:55
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
    很受用
2009-1-20 13:27
0
雪    币: 471
活跃值: (4013)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
分享心得的帖子要支持
2009-1-22 14:29
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习..................以后参考
2009-1-22 21:57
0
雪    币: 307
活跃值: (131)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
关于1.Jmp stub Function...
使用stub的本意是在debug状态下可以动态修改代码并编译后执行,在调试代码的时候非常有用.
请参考命令行选项:
/Gi[-] enable incremental compilation
/ZI enable Edit and Continue debug info
2009-1-23 23:38
0
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
我有点看不懂,
2009-1-26 01:01
0
雪    币: 1363
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
呵呵,,来看看
2009-4-9 16:50
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
16
收藏,以后便于查询。
2009-4-10 08:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
    VC只安装了一次  还被点成VB编译环境   不晓得怎么换  糗死   等系统搞定再琢磨咯
2009-7-2 08:23
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习学习
2009-7-4 10:24
0
雪    币: 338
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢LZ分享
2009-7-4 12:43
0
雪    币: 306
活跃值: (153)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
呵呵,挺不错的,
2009-7-4 13:03
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
自己归纳的?貌似在vckbase上看到过一模一样的,而且还多几个。。
2009-7-4 13:24
0
雪    币: 89
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
说明VC++的 编译过程中是线性的!!
在C语言缺陷这本书中:
有提到类似的问题!   在编写       sum=x/*y;  这种语句的时候 编译器就会自动认为 /*后面是注释语言! 然后编译器就会一直找   */结束 但是找不到  就报错误!!
2009-7-14 11:00
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
mark下。
2009-7-14 18:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
看看
2009-7-15 08:19
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主要是能把自己的经验总结成一个chm格式的文件发布一下就好了。
2009-7-29 14:02
0
游客
登录 | 注册 方可回帖
返回
//