能力值:
( LV2,RANK:10 )
|
-
-
2 楼
用ret x平衡堆栈就ok了。
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
你最好买本罗云彬的 WIN下32位汇编程序设计
参数肯定是PUSH 压进堆栈里然后用函数处理的
至于没有POP 那是因为他这个函数内部返回的时候肯定已经平衡堆栈了
比如说 PUSH EAX
PUAH ECX
CALL XXXX
那么你跟入这个XXX的调用里返回的时候肯定会有 RET 8 的语句,这句就把压进的EAX和ECX弹出堆栈了,这就平衡了..不一定非要用POP
|
能力值:
( LV9,RANK:180 )
|
-
-
4 楼
谢谢。知道了
我的理解是:
PUSH EAX
PUAH ECX
call yyyyyy
在yyyyy中有RET X,
相当于
POP EXA
POP EAX
但是对于:
7349BBE6 M> FF7424 08 push dword ptr ss:[esp+8]
7349BBEA FF7424 08 push dword ptr ss:[esp+8]
7349BBEE 6A 00 push 0
7349BBF0 E8 2254FFFF call MSVBVM60.73491017
入栈的是一个内存中的数据和0,retn 时,不是寄存器内容。它是如何弹出栈的呢?特别是push 0,它弹出的又是什么?
但还要请教一下: retn X 中后面的数字代表什么?
太迷糊了,请大家再指教指教。
谢谢!
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
堆栈的顶是用ESP来表示的,采用先进后出,高端内存向低断内存方向压和弹.
就象你象杯里放冰块,最先放进去的要最后才能拿出来~
调用了函数必然要恢复原来的ESP值,因为你用了PUSH一次, ESP就减了4,因为32位操作的都是DWORD类型.刚刚压了俩次PUSH ,那就是说减了8,你若只恢复ESP 而不做POP,那么一般就用RET 8 了, 若你压了三次,那就要 RET C 了 这时候ESP就恢复了,而原来那些ESP地址上面的数据就是垃圾了,没用了.
你若要弹出的直要赋予寄存器, 那就要用类似POP EAX,操作后相当于:
MOV eax,[esp] 堆栈顶的数据给EAX
add esp,4 ESP直加4
建仪你看书吧,这么简单的问题问来问去的~~
汗!!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不是每个的人启点都是高的。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这些东西自己想可能会好久,经高人指点会事半功倍,看你们一问一答我也学到不少东西,真好!
|
能力值:
( LV9,RANK:170 )
|
-
-
8 楼
自己看书一种办法,但有的东西自己看有时确实不易理解。
|
|
|