能力值:
( LV9,RANK:170 )
|
-
-
2 楼
对于 push 指令,认为简单就是简单,认为复杂就是复杂
下面看看从低往深的理解:
第1层:就是入栈
第2层:怎样入栈?用C代表就是:esp--; *esp = XXX;
第3层:esp-- 是多少?
答案:一般来说:在实模式下是 esp 减 2,在保护模式下 esp 减 4,在 64 bit 模式下 rsp 减 8。
第4层:为什么实模下减 2,保护模式下减 4,64 bit 模式下减 8 ?
答案:esp(stack pointer)减多少,取决于 SS.B。
SS.B 是什么?SS.B 就是 SS 寄存器内的 B 属性,这个 B 属性就是:data segment default operand size(数据段缺省的操作数大小),SS 寄存器所装载的 segment descriptor 这时表示为 stack segment descriptor,B 属性用来表示:缺省的 stack 的操作数大小。
即:B = 1 时,它的栈操作数是 32 位,B = 0,它的栈操作数是 16 位。
在实模式下,SS.B 一定是 0,表示实模式下栈的操作数是 16,所以,sp 减 2。
在保护模式下,SS.B 总是被置为 1,表示保护模式下操作数是 32 位,所以,esp 减 4。
在 64 bit 模式下,SS.B 是无效的,x64 定义栈操作数强制为 64 位。
第 5 层:可以更改栈操作数大小吗?
答案:可以。
在实模式下,几乎不能更改栈操作数大小,但还是有办法的,这里就不说了。
在保护模式下,若定义的 B = 0 则为16 位,但所有的 OS 都不会这么做。所有 OS 栈的缺省操作数都是 32 位。
但是,可以 32 位的栈上强制压入 16 位的值。这样造成栈边界不对齐。产生性能问题。
在 64 位模式下,不能改变,所有的栈操作数都是 64 位。
第6层:push 压入的数据是多大?
答案:缺省情况下,就是上面所说的栈操作数大小。
但是,在强制情况下,16 位栈可以压入 32 位值,32位栈可以压入16位。64位栈只能固定压入64位值。
第7层:压入后栈指针,指向哪?
答案:就是栈顶,ESP 指向栈顶。
第8层:往哪个栈压栈呢?
答案:就是往当前的栈压入栈。
第9层:什么是当前的栈?
答案:SS:SP、SS:ESP 和 SS:RSP 就是代表当前的栈。
当 SS:ESP 指向内核栈时,当前的栈就是内核栈。当 SS:ESP 指向用户栈时,当前的栈就是用户栈。
第10层:什么时候指向用户栈?什么时候指向内核栈?
答案:当代码转入内核,或者说:代码陷入内核时。SS:ESP 会切换到内核栈。一般的应用层上都使用用户栈。
第11层:能使用DS访问栈吗?
答案:看情况,在平垣的内存模式下,可以使用DS该问栈,也就是,数据段来指引栈段。现在绝大多数OS 都是平垣的内存管理模式下,所以,绝大多数情况下,可以用DS段访问SS 段
-----------------------------------------------------------
上面的11层中,你理解到哪一层呀?
一般的人都是理解到 第 3 层而已。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
1.SS 堆栈段 esp是堆栈寄存器,始终指向栈顶
Push把值压入堆栈 esp=esp-4 入栈元素存入esp
Pop把值弹出堆栈 把esp中存储值给出栈元素 esp=esp+4
2.伪指令需要写
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看看是不是现金: 200 Kx
伪指令要写,记得好象看过伪指令是在编译器这一层来支持的,源代码中的伪指令编译时都被编译器实现了.
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
谢谢楼上的回答。另外再问一下
1. esp指令所指的堆栈段若在程序中没有装入,系统是怎么分配的?
2. fstsw指令是什么意思?~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
正在看王爽的汇编语言,推荐去看看吧,其中第三章有push、pop的讲解感觉让我这个菜鸟明白了不少
|
能力值:
( LV9,RANK:260 )
|
-
-
7 楼
貌似push指令没有这么恐怖吧,而且所划得层次感觉有些不实:比如说,有些人明白了第七层却不知第四层是为何?却是为何!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
支持MIK,经典...
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
呵呵,写得真详细。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
路过学习了。楼主的精神值得学习呀
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
买一本书,下50级的视频教程 1个月就可以学会了,然后就都能看懂一般的知识了。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
伪指令要写,push我也不是很理解..
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
啊,2楼的朋友写得真详细
|
能力值:
( LV3,RANK:30 )
|
-
-
14 楼
感谢大家的发言 感谢十楼夸奖
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
恩。很详细。收下慢慢看
|
能力值:
( LV8,RANK:120 )
|
-
-
16 楼
回楼主后面的问题~!~!:
FSTSW:
FPU储存狀态暂存器值至AX(这个指令的功用是用来把状态字组取出并存入记忆体变数里,而这个记忆体变数必须是 16 位元的记忆体变数)
FPU 的暂存器可分为五类,堆叠暂存器 (register stack)、状态字组 (status word)、控制字组 (control word)、标籤字组 (tag word)、例外指标 (exception pointer)。虽然看起来很複杂,但是最重要且最常用的是堆叠暂存器。
FPU 共有八个堆叠暂存器,分别是 ST、ST(1)、ST(2)、ST(3)……ST(7),这八个暂存器每一个都是 80 位元,用来存放运算时所需要的资料,这和以前我们所说的堆叠所存的资料不太相同,但是操作方式却是一样的。FPU 许多运算都是先把数值推入堆叠顶端的 ST 暂存器,再对 ST 暂存器作运算
使用
在OD的寄存器地方就可以看到这8个堆叠暂存器 如图:
|
能力值:
( LV3,RANK:30 )
|
-
-
17 楼
感谢cmdxhz的回答
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
如果你要跑航线,就驾船按航线跑,终点码头是你的目标。
如果你要探寻大海的奥秘,你就驾船满大海探寻。
如果你要浏览大海风光,你就满大海跑船。。。
|
能力值:
( LV3,RANK:30 )
|
-
-
19 楼
- -啥?~
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
辛苦啊 lZ.
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
好有哲理 没怎么理解明白 我的理解:
如果我是想学破解软件,那就拿汇编当船用,达到破解的目的
如果我是想学汇编,就要把他学好
如果只是想了解下,就粗略的看一遍吧
理解不对,不要BS我
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
push就是压栈啊
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
楼主的研究精神值得学习~~
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
狂赞2楼,真详细!
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
学习一下进来
|
|
|