首页
社区
课程
招聘
[求助]关于汇编中寄存器保护
2010-11-1 14:09 5266

[求助]关于汇编中寄存器保护

2010-11-1 14:09
5266
这个责任应该谁来做呢?
是一个函数在修改寄存器前将寄存器保护起来呢, 还是由上一层调用方来保存?

这么问有点不清楚,我自己总被绕糊涂,

过程 A 的过程中 会用到  ecx, ebx
在计算过程中 会调用 过程  B, B同样修改 ecx, ebx
这时对于A 的ecx, ebx 应该在A 调用B前自行保护, 还是B来保证不对别人造成影响?

自己感觉应该是A自己保护,这样是不是效率能高些呢, 不过我在C/C++ 调用汇编的函数时,就遇到了问题:
   对于非优化代码没任何问题, 优化的代码会crash

   如果在调用汇编函数前调用 pushad popad, 则均无问题

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

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
levizhou 1 2010-11-1 14:11
2
0
如题, 找了半天,一直以为是灰掉的

作了剧烈的思想斗争才点的
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrylhj 2010-11-1 15:08
3
0
无论在函数A内pushad还是在函数B内pushad感觉都一样,只需要一个就可以了
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
levizhou 1 2010-11-1 15:15
4
0
我是想了解一般化的做法, 那种更常见些
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2010-11-1 16:45
5
0
1、你自己的函数在操作改变edi esi ebx ebp esp这几个寄存器的值时,你必须先保存这几个寄存器原先的值,并在函数返回之前恢复上述这几个寄存器原先的值。
2、你的函数在调用外部的函数时,edi esi ebx ebp esp这几个寄存器不会被函数修改,所以在调用外部函数时你的函数不用进行保存,但eax ecx edx这三个寄存器的值你的函数在调用外部函数前必须先保存。
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
levizhou 1 2010-11-2 08:45
6
0
谢谢虾版,
也就是说函数在完成功能之后需要恢复之前的环境, 对吧。

修改了下代码,果然过去了, 关于vc如何对代码进行优化,有什么文章推荐么?

我的代码不优化昧问题,优化之后就运行不下去了
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2010-11-2 12:46
7
0
一般而言,Vc优化不优化,不会对你所写的程序有问题,至少我还没遇到过这样的事。所以,估计还是你的代码哪里出错了,还是多检查一下你的代码问题,你是在vc里使用内联汇编?如果是这样,在用内联汇编的时候要注意你修改的寄存器vc代码里有没有使用到,堆栈有没有乱,这些在内联汇编中必须格外小心注意。
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
levizhou 1 2010-11-2 14:24
8
0
我找到问题了,就是我用汇编写的地方edi,esi没有恢复, 不是内联汇编

估计是在优化的代码中编译器有用到这两个寄存器,

debug 和 去掉优化的release版本都不会有问题, 优化过的release版本会crash
游客
登录 | 注册 方可回帖
返回