2010-10-12 46 views
7

這可能是一個簡單但明顯的事情,我只是沒有看到,但我如何在MIPS64處理器中加載地址?在MIPS32處理器以下彙編僞指令:在MIPS64中加載地址

la $at, LabelAddr 

擴展爲:

lui $at, LabelAddr[31:16] 
ori $at,$at, LabelAddr[15:0] 

望着MIPS64指令集,我看到lui仍然加載16位立即進入上半的32位字。似乎沒有任何類型的擴展指令將立即加載到64位字的上部區域。這樣看起來,那麼,做一個la僞指令相當於我需要擴展到代碼是這樣的:

lui $at, LabelAddr[63:48] 
ori $at, $at, LabelAddr[47:32] 
sll $at, 16 
ori $at, $at, LabelAddr[31:16] 
sll $at, 16 
ori $at, $at, LabelAddr[15:0] 

這令我有點...令人費解的東西一樣基本負荷一個地址,所以它讓我相信我忽略了一些東西。

我忽略了什麼(如果有的話)?

+0

這與RISC架構一個共同的問題 - 也PowerPC的採取類似的指令數來加載一個64位立即地址/值。你可能會想要一個宏。 – 2010-10-12 12:09:21

+0

因此,總之,我沒有真正忽視任何事情。這實際上是一種解脫。 – 2010-10-12 12:17:30

+0

可能不會 - 在MIPS64上做這件事可能會稍微簡潔一些,所以如果您現在將它隱藏在宏中,那麼您以後可以隨時對其進行改進。 – 2010-10-12 20:59:37

回答

3

我想如果你需要加載很多常量,你應該把它放在一個常量池(A.K.A "literal pool")中,然後通過ld指令加載它。

例如:$s0包含池的基址,並要加載的常數偏移添加48,您可以通過指令ld $t1, 48($s0)

此技術加載到$t1ARM,在那裏很常見指令只能加載12位立即數。它也用於Java

我只知道基本的MIPS32,因此可能指令語法不是很正確,但這就是主意。


編輯:有這麼離開我確信,我忽略了一些例子 here

0

地址。 我忽略了什麼(如果有的話)?

你所缺少的是,即使在MIPS64的指令大小保持32位(4字節)。在這個32位機器碼編碼系統中,'la'翻譯成'lui'+'ori'組合可以處理最大32位值(地址)。 4字節機器指令中沒有足夠的位來輕鬆編碼64位地址。爲了處理64位地址,使用相同的更多迭代(lui + ori)和shift(dsll)。

Paxym

+0

那樣你需要6條指令來加載一個單獨的值 – 2016-07-22 03:05:20