看板 Grad-ProbAsk 關於我們 聯絡資訊
※ 引述《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)
bernachom:好清楚,謝謝您^^ 06/10 09:03