- 论坛徽章:
- 0
|
我对硬件栈理解也是比较模糊的,我是这样认为的,有不同意的一起讨论吧!
我认为硬件有两层结构:
1.第一层是功能支持硬件,ALU,Register,memory,PC这些东西,他们的引脚构成了最原始的指令,换句话说比如一个32位原始指令,连接到32个这样的引脚上,实现一定的功能,比如ALU的加法操作,取memory数据,指令,保存ALU结果到Register,memory等,我把这些叫原始opcode,注意这些指令不是我们常说的硬件指令集.
2.第二层是软件功能硬件(也就是硬件实现软件功能,既硬件栈),为什么实现这一层,我觉的从两个层次说下,一是实现方式,一是目的.
实现方式:把几条上一层原始opcode封装成一条这一层opcode(我认为这一层提供的opcode才是我们平常说的硬件指令集).比如一条PUSH或POP指令,可以分解为以下几条第一层原始opcode指令:
PUSH一个memory操作数到堆栈 1)in 源mem地址 , (2)out 目的mem地址(既栈顶,这是基于内存栈的,如果是寄存器栈则out到寄存器中) , (3)修改栈指针
再比如一条Call指令,分解为下面几条原始opcode
(1)push return_address(这的push指令是刚才实现的那个,为了清楚而已,其实是实现push的那几条原始opcode)
(2)保存调用者的现场(具体看怎摸实现了,可以保存在return_address后面的栈里,也可以保存在其他地方)
(3)jmp start_address
(4)(return_address)这不是opcode,只是说明一下这是函数调用的返回地址,第一条push指令将他保存在堆栈中,函数体里的ret在原始opcode实现中会jmp回来
目的:实现硬件栈的目标,我觉的是:
(1):函数调用中用栈结构是最好的选择,所以用硬件实现,提高效率
(2):原始opcode太过于复杂,基于硬件栈封装了一层的opcode更容易理解一点吧,这才是我们平常所说的硬件指令集(3):原始opcode反映出了硬件结构,也许有保护结构的需要吧
再说下硬件栈的结构吧,如果是基于内存栈的,那我们平常见到的80x86中的SS,ESP寄存器应该就在这第层硬件结构中,硬件栈PUSH指令应该带有两个参数,分别保存到SS,ESP用于实现这种栈操作,而我们所说的软件栈,无论是实模式还是保护模式最终都是调用的这个PUSH指令.
最后,堆栈是种数据结构,那他必然是基于代码了,无论是硬件实现还是软件实现,最终他都要归为软件一类,所以硬件栈只是其他功能硬件的补充,并不能归为硬件结构一类.
这只是我的理解,不一定对,有不同的理解写出来,大家再讨论.
[ 本帖最后由 sgrwf 于 2007-10-30 21:37 编辑 ] |
|