作者svanavs (svanavs)
看板Grad-ProbAsk
标题Re: [理工] 计组-指令集一些问题
时间Wed Jun 10 01:54:24 2009
※ 引述《bernachom (Terry)》之铭言:
: 这是今天和一些同学讨论出来的
: 请教一下
: 1.如果程式很大的话,超过jump或是分支指令的长度,多很多的话
: 那程式会怎麽跳?跳两次吗?还是就不执行了?
这问题白算盘有提到..
先讲 branch(bne,beq) 格式 : 6,5,5,
16
MIPS 是用
PC-relative addressing 来来算出目的地
branch主要来自loop和if的使用,目的地都在附近而已
不太会有距离太长跳不到的情况,如果万一发生种情况
都是让 assembler 来处理,举个例子 :
bne $s0 , $s1 , L1
.
.
.
L1 : (离bne远到 16 bits 无法定址)
assembler 会额外插入一个 jump 指令 :
bne $s0 , $s1 ,
L2
L2 : j L1
.
.
.
L1 : (足以用 26 bits 定址)
你也许会问,那如果连26 bits 都不能定址呢 ?
答案是 : 不可能 ! (原因请看jump的说明)
再来 jump(j,jal) 格式 : 6,
26
jump主要来自 procedure call,目的地大多离自己很远
所以 jump 用 26 bits 来表示目的地位置(2^26 words)
但实际可表示的范围是 28 bits (2^28 bytes)
MIPS做法是用 PC 的最高 4 bits 与 28 bits 相接成 32 bit 位址
这种定址方法叫
Pseudo-direct addressing
值得注意的是
在组译後 loader 和 linker 把整个程式分配到记忆体时
就要避免把某个过长的程式区段放进去(> 2^28 bytes )
换句话说一张page大小不能超过 64MB ~
: 2.像我们会有一些op rs rt rd之类的东西使用暂存器来存一些指令
: 例如 : else: add $t0,$s0,$s1
: add之後的指令都可以存放在暂存器,那 else:
: ^^^^^^^
: 这东西会放在哪呢?也是放在暂存器吗?
: 谢谢
前篇有人回答了 ^^
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.199.28
※ 编辑: svanavs 来自: 220.133.199.28 (06/10 01:56)
1F:推 bernachom:好清楚,谢谢您^^ 06/10 09:03