推 bernachom:好清楚,謝謝您^^ 06/10 09:03
※ 引述《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)