能力值:
( LV2,RANK:10 )
|
-
-
2 楼
以及压入的先后顺序???我在书里找不到这七个字节啊??是七个吧,于渊的书里就只有cs和ip就没了,这两个加起来不是6个字节吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
堆栈中,都是以4字节为大小的。你仔细观察下。
当调用函数的时候,首先将函数的参数压栈,最后将函数的返回值压栈。
7个字节是怎么来的哦?求指教
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
为什么下载要钱@@@@@
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我写了个程序,反汇编,看到有个模块是这样的,它取最后一个压入栈的参数是:
mov eax,[ebp+8]
所以ebp之上的7个字节不就是call指令压入的东西喽。
加之cs是十六位,ip是32位,所以加起来不就是6个字节喽
所以我就不知道压入栈的是什么鬼东西了啊?
我在分析一个模块的时候,它就是用了里面这些鬼东西其中的一个不知道干什么了,所以问起来了。。。
望解答啊。。。。
假如是四个四个字节对齐的话,那么为什么取最后一个参数是mov eax,[ebp+8] ???
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
有不对的望指正啊,多谢
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我一时忘了ebp也要四个字节保存的,所以压入栈的是四个字节的ip。。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
如何学习!!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我原来那个也有笔误,应该是先压参数(如果有), 然后压函数的返回地址。ebp+8,这个8是个偏移量。。。
堆栈是向下增长的,当push的时候,就减小,pop的时候就增大。举个例子,比如有个函数int WINAPI foo(int a, int b),那么在调用这个函数的时候,堆栈的情况就是这样的: 0x00400010 ->函数的返回地址
0x0040000c ->参数a
0x00400008 ->参数b
我也是新手,如有错误,还请指教
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
1:字节计数是从0开始,所以根据MOV EAX [EBP+8]得到前面应该还有8个字节,不是7个.
2:由于CALL指令压入返回地址,堆栈指针减4 .进入被CALL程序后,先结构堆栈,POP EBP ; MOV EBP,ESP;堆栈指针再减4(假设没有局部变量,如果有的话,那就还要SUB ESP,n了,n是4的倍数).你说现在要取得最后一个参数是不是因该MOV EAX [EBP+8]呀?(如果有局部变量则MOV EAX [EBP+n+8])
现在知道前面8个字节是什么东西了吧?如果汗不知道得话我告诉你:[EBP+4]里的数是上一个栈结构的首地址,[EBP]里的是返回地址.不知道搂主所说的CS,ip是什么.能否说详细点?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
call 是一个指数把,只一个CALL,长度是不固定的,应该根据跳转距离和寻址方式判定。
在那本书是指数为了解释这个指令是怎样执行的,才分解成多指令的。
不知道对不对。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
[QUOTE=atgameover;995270]1:字节计数是从0开始,所以根据MOV EAX [EBP+8]得到前面应该还有8个字节,不是7个.
2:由于CALL指令压入返回地址,堆栈指针减4 .进入被CALL程序后,先结构堆栈,POP EBP ; MOV EBP,ESP;堆栈指针再减4(假设没有局部变量,如果有的话,那就还要SUB ESP,...[/QUOTE]
估计他是看的16位的汇编,CS是代码段,ip是当前指令指针
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
看眼三楼的图,很直观
http://bbs.pediy.com/showthread.php?t=31840
|
|
|