能力值:
( LV2,RANK:10 )
|
-
-
2 楼
应该是这个意思。
PUSH SP 之前 PUSH SP 之后
+------+ +------+
FFE8 | 1234 | FFE8 | 1234 |
+------+ +------+
FFEA | 1234 | SP->FFEA | FFEA |
(8086) +------+ +------+
SP->FFEC | 1234 | FFEC | 1234 |
+------+ +------+
FFEE | 1234 | FFEE | 1234 |
+------+ +------+
+------+ +------+
FFE8 | 1234 | FFE8 | 1234 |
(P6 family, +------+ +------+
Pentium, FFEA | 1234 | SP->FFEA | FFEC |
Intel 486 +------+ +------+
/386/286) SP->FFEC | 1234 | FFEC | 1234 |
+------+ +------+
FFEE | 1234 | FFEE | 1234 |
+------+ +------+
|
能力值:
( LV15,RANK:2473 )
|
-
-
3 楼
8086是16位机,堆栈指针用sp
80386是32位机,可以工作在16位模式下堆栈指针用sp,也可以工作在32位模式下堆栈指针用esp
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
搞明白push操作的机制就OK了,建议去看Intel手册。Vol 2B
说简单些,就是CPU在执行push指令的时候的动作,实际上是分成两步的:
1. sub (e)sp, n
2. mov [sp], xxx
在CPU压栈的时候,都是要先把SP减去一个值,然后才向栈指针寄存器指向的内存写东西的。只有这样,你才能通过栈指针访问到栈顶的内容。
对于栈的操作,不存在一次压一1个,3个字节的情况,CPU会自动进行内存边界对齐。上面的sub的是esp还是sp,取决于你的代码是16还是32位的,16位的就是sp,32位的就是esp,如果是sp,当然就会一次减去2个字节,32位的,一次就减去4个字节。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
[QUOTE=puretears;669522]搞明白push操作的机制就OK了,建议去看Intel手册。Vol 2B
说简单些,就是CPU在执行push指令的时候的动作,实际上是分成两步的:
1. sub (e)sp, n
2. mov [sp], xxx
在CPU压栈的时候,都是要先把SP减去一个值,然后才向栈指针寄存器指向的...[/QUOTE]
很正确,顺路走过。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
呵呵 我也学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
学习中............
|
|
|