首页
社区
课程
招聘
win32汇编的兄弟们,程序中用寄存器千W要慎重
发表于: 2005-9-6 17:04 7995

win32汇编的兄弟们,程序中用寄存器千W要慎重

2005-9-6 17:04
7995
win32汇编学了一个来月了,每天都是照着别人的例子写......太没有成就感,今天心血来潮,也自个写了一个小程序,资源文件,写代码,编译都没有错误....但运行时,有几个功能就是无法实现.....然后检查这几个功能模块的代码...找呀找,来回看了好几篇,感觉就是没有错,心情别提多郁闷了,俺被逼急了,无奈之下使用了最原始的办法:重写代码....先从最简单的功能开始实现,一边调试一边加代码,终于被俺找出来了,原来俺用了寄存器edx传递变量值......后改为edi,所有功能正常被实现.

在这里,顺便问下各位前辈,在程序中,有多少寄存器不能用的呀?

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
通常寄存器的用法,每?compiler都不一?.但是在windows的API奄,ebx,esi,edi,ebp是不??的.eax一定是用?作return value.而Microsoft的c/c++ compiler通常?用ecx?作*this pointer.
2005-9-6 17:43
0
雪    币: 298
活跃值: (445)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
3
用之前
pushad
用完后
popad
这样除了esp,其它寄存器都可以使用

如果你想要使用某个寄存器,可以先将它压栈。
比如
push ebx
用完后
pop ebx
2005-9-6 17:49
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我用的是masm32汇编,编译器是自带的ml,昨天那程序,我试了用edx,ecx,esi,edi,能够正常得到结果的只有esi,edi

我想这个错误应该和压栈没有关系,可能是API内部的实现过程中,调用了edx和ecx作为值传递,而涵数返回后没有恢复到我们设的值,所以才产生的错误
2005-9-7 08:58
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
eax、edx和ecx在调用API函数时都有可能会被改变,而esi、edi、ebp、ebx寄存器API是不会改变他们的值的。所以如果你要调用API,eax、ecx、edx的值你必须先保存一下或转到edi、esi、ebx、ebp里。
2005-9-7 09:32
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
明白了,谢谢
2005-9-7 12:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看了上面的帖子,我也学到一点东西了!
2005-9-7 14:18
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
ebx edi esi三个寄存器使用应慎重.
除以上各位所说外,不同操作系统对他们的处理也不同,如98/xp.
倘若没有把握,可以在过程或函数定义中用proc uses ebx edi esi进行保护.
2005-9-10 11:12
0
游客
登录 | 注册 方可回帖
返回
//