没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
体系结构概述
陈怀临
。序言
本文介绍 体系结构,着重于其寄存器约定, 及存储管理,异常和中断处理等等。
通过本文,希望能提供一个基本的轮廓概念给对 及之上 有兴趣的读者。
并能开始阅读更详细的归约资料。
是最早的,最成功的 !"#$!"%#$%!#!处理 器之一,起源于
&%'"%( 的电机系其创始人 )%*+!%%!, 在 -./ 年在硅谷创立
了 公司$。)%*+!%%!, 目前是 &%'"%(的校长。
在此之前,他是 &%'" 电子工程学院的 0!&%。 专业的学生都知道两本著名的书:
1#!&%2&%&%"0!%!+&"&!'&!%!'&$!3和
3#!$!$#!4#&%&(!&$1。其 5&# 就是 +!%%!,
的名字为“$$#!#%!6$7!"!6%!&!8的缩写。另外一个
通常的非正式的说法是”66%'%#$%!!$%"8
芯片在工业界目前用的比较多的是:。的
9999;40:!"%$$。--; 年从 。分出来的的
<999, =999 等。
指令集
详细的资料请参阅 归约。
一般而言, 指令系统有:;;和 >。可想而知,指令系统
是向后兼容的。例如,基于 的代码可以在 和 > 的处理器上跑一跑:5
下面是当我们用 $$ 时,如何指定指令和 的选项。
5$#?$#,!
#!!"!''!&$%!,!$#,!!%$!"#6%%#$%
!$$!'$#,!&!@A999BC@D999BC@/999BC@//99BC@/;99BC
&%"@;999BE6!$7%&!$F$$#,!66$!"#6!%&&!6,
'&&$#6&$C!$6!66%!%!&!&%,$"!&"!
%!!6!(!6'!%#$%!&$!$#!#!@5AB
@5DB$!G!%#!"
5
#!%#$%'6!(!6'!!"!'@D999B!
"!'$#,!&6!(!6
5A
#!%#$%'6!(!6A'!G&%$67!6,C:#&!
%#$%@;999B!"!'$#,!&6!(!6
5D
#!%#$%'6!(!6D'!;/G%#$%@/999B!
"!'$#,!&6!(!6%"!%$&%!!2!'&%,'
!"&&,!
读者可能发现,对于大多数而言,我们应该是用 或5D。要提醒的是 <999 和
9999 也都是 /999 的延伸产品。
下面是几点补充:
H 指令是 DA 位长,即使在 ;/ 位的 上。这对于局部跳转指令的理解很有帮助。
比如:) I;)* I。) 和 )* 的 0 是 ; 位,剩下的 A; 为存放跳转
偏移量。由于任何一个指令都是 DA 位或 / 字节对齐*I的,所以 )和 )* 最大的伸缩空
间是 AJA.?A<;。如果你的程序要作超过 A<; 的跳转,你就必须用 )* 或 ) ,通过一
个 I 寄存器来存放你的跳转地址。由于一个寄存器是 DA 或 ;/ 位的,你就没有任何限制了。
H 的 I 中有几位是很重要的设置,当我们选择指令系统或要
用 ;/ 位的 的 在 DA 模式下绝大多数情况,弟兄们 别告诉我你在写 ;/ 位的
程序:55。
KLLM:
:> N*
9:> N*
KOLM
KLM
KLM:
9: 工作在 DA 位模式下
: 工作在 ;/ 位模式下
一般而言,如果你要从头写一个 核心为 DA 位程序,最好把上述值设为 9。为什么最好呢?
因为我在工作中没有去冒风险,设她们为 ,7%"&!%P5%"
!%,G!55P
H在以后我们会单独的一章讲将流水线和指令系统,特别是跳转指令的关系。在这里,我们只简
单提一下。对任何一个跳传指令后面, *Q,要加上一个空转指令。从而使
得 的 * 不会错误的执行一个预取 R+得指令。当然这个 可以替换
为别的。以后再讲。放一个 是最简单和安全的。有兴趣的读者可以用 ;/5!6'5
G"#5"来反汇编一个
N) 文件。你就会一目了然了。
H一定要记住:,, 和 > 指令系统不包含 >*0I0 。
换句话说,都是那些在 0 下可以用的指令当然 O * 下也能用。对于 的
操作不属于指令系统。
H有一点在 下,要千万注意:*I。 对 *I 的要求是严厉的。这一点与
E 是天壤之别。指令必须是 DA 位对齐。数据类型必须在她们的的
大小边界对齐。简单的比如:E!%#%%%#%"!DAG"!C%#DAG
&6%!"S6%DAG&6%!"S%!#G!DAG&6%!"S$&#.G
&6%!"6%6%#;/G&6%!"S关于这一点 ,我是吃过苦头的。当然我知道大家
还会犯错在这里:55,即使知道了。有些事情学是没用的:55。一定要注意。
H我建议读者阅读 时要花时间看一看指令系统的定义。其实不难。每一种指令
不外乎几个域*0。
寄存器约定
对于在一个 上进行开发,掌握其工作的 的寄存器约定是非常重要的。
体系结构提供了 DA 个 I I * I 。这 DA 个寄存器的用法
大致如下:
I I
T9T2!常量 9$%&%(&6#!9
TA5TDT(95T(函数调用返回值(&6#!'!#6&%"!!%!(&6#&%
T/5T=T&95T&D函数调用参数&#!%
T.5T<T95T=暂时的或随便用的
T;5TADT95T=保存的或如果用,需要 > 的&(!"
TA/5TA<T.5T-暂时的或随便用的
TA.T全局指针I6G&6%!
TA-T堆栈指针&$7%!
TD9T'帧指针&!%!
N:'&6!&$#&66,C&%"$&%G!6,#!"&T.
TDT&返回地址!#%&""!
对一个 的寄存器约定的正确用法是非常重要的。当然对 语言开发者不需要关心,因为
* 会 O 。但对于 O * 的开发或 0 > 开发的人就HH必须HH清楚。
一般来讲,你通过 G"#5" 可以清醒的看到寄存器的用法。
下面通过我刚才写的一个简单例子来讲解:
U(+!66$
8+!66$8K!F6!M
H&6!66#&!!!$%(!%%
H5#N
HA-A99
H
%&""#%$%C%S
%#G#%$%S
("&%
V
%C,C2S
?S
,?AS
2?&""#%$C,S
W
%&""#%$%C%,
V
%(&6#!?<S
%(&6#!AS
(&6#!A?#G#%$(&6#!S
!#%X,X(&6#!AS
W
%#G#%$%(&6#!
V
!#%(&6#!55S
W
上面是一个 程序,&%函数调用一个加法的子函数。让我们来看看编译器是如何产生代码
的。
UG%%=/YG%5!6'5$$5$+!66+!66$5D5$#?/9995DA5
'DA5
UG%%=<YG%;/5!6'5G"#5"+!66
+!66F6!'&!6'DA5G
0&!G6,'!$%!
H&%#%$%H
9999999999999999
H$!&!&&$7'&!G,(%!&$7%!.
HG,!"%&%"!&%!#"&!!(&6#!
H
9A=G"Z'.&""#TCTC5.
H&(!!!#%&""!!$#!%%H
/&'G'9999T&C9T
.9$999999&69
H%'!"!6&,6H
$99999999%
H66!&#!%&9!(&6#!H
9A/9/9996T&9C
H)#!&""#%$H
/9$99999&&6A.
H+ E,!F66!!$%"&#!%
HG!%"!&""#%$'#%$%$&66P
H&66&G#!858$6&%2&%
HE&$!$#!C!%#$%&'!#
H66&6G!'!$!"%!6%!&%"!
H!!$#!"!!'!C!$&%!&!
H!$%"&#!%66G!F66!"!(&6#!'
H%!!A
H
.A/9<999A6T&CA
H*&"!!#%&""!'!&$7%!
H!!!&!!#6(9$%&%!!#6'
H&""#%$'#%$%$&66
H
$.'G'99996T&C9T
H !#%H
A99D!9999.T&
H !!!&$7'&!H
A/A=G"999.&""#TCTC.
H&""#%$#%$%H
99999999999999A.
H!&!&&$7'&!G,&66$&%;G,!/
剩余45页未读,继续阅读
_玉米_
- 粉丝: 4
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2