首页
社区
课程
招聘
windows api是如何实现保护esi,esi,ebx的?
发表于: 2006-4-12 00:07 6655

windows api是如何实现保护esi,esi,ebx的?

2006-4-12 00:07
6655
windows的api应该不会全用asm实现的吧,大部分应该还是用C写的,既然用C写的,那他是如何保证的?

还有一个问题,比如我自定义了一个函数
int fn(int arg1,int arg2)
{
.......
}
有没有办法可以指定让编译器在fn函数内部不要使用某个寄存器,比如ecx
或者在某一段代码内不使用某个指定的寄存器
比如
//begin
int a;
a=fn(arg1,arg2)
....
//end  在此段内不使用 ecx

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
2
这个问题估计与编译器有关。
2006-4-12 00:36
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
随便找个api进去看一看
上手
push ebx
push esi
push edi
最后
pop edi
pop esi
pop ebx
2006-4-12 08:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 堀北真希 发布
随便找个api进去看一看
上手
push ebx
push esi
push edi
........

我知道他是用push和pop来保护的,我的意思是如何让编译器保护用户指定的某个寄存器或者是干脆不动用某个寄存器
2006-4-12 11:02
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
编译器还无法做到如此底层的控制.
一般就用PUSH/POP的方法保护就行了,速度影响是很小的.
2006-4-12 11:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
刚才把自己用BCB6和VC6写的程序反汇编仔细看了看,
BCB编译器是尽量避开使用esi,edi和ebx三个寄存器,迫不得已使用的话会保护起来,VC虽然不是尽量避开使用,但也会将他们保护起来,难道保护这三个寄存器是windows平台下编译器的约定?而不仅仅是windows API才这么做
2006-4-12 11:32
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
不错。
2006-4-12 12:10
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
减少麻烦的无耐之举
2006-4-14 19:16
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
保护esi,edi和ebx是为存储器寻址不受影响
在早期bx寄存器又称基地址寄存器,在ax,bx,cx,dx中唯一可作为存储器指针使用的。
edi,esi是变址寄存器。
====================
至于楼主的想法恐怕无法实现吧
2006-4-14 20:48
0
雪    币: 211
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼主的想法可以实现的啊
好像VC的裸函数就是为了实现这个吧
2006-4-14 23:19
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
最初由 17521 发布
楼主的想法可以实现的啊
好像VC的裸函数就是为了实现这个吧

但naked函数很难加入C代码.
2006-4-15 10:35
0
游客
登录 | 注册 方可回帖
返回
//