2012-10-11 69 views
0

我在將程序集中的特定行翻譯爲機器代碼Nios II時遇到問題。 我已成功編輯這些行:手動編譯組件

START_TIMER = 0xF68C 
r0 = 0x0 
r8 = 0x8 
label = 50000 

#orhi r8, r0, %hiadj(label) --> 00000 01000 ???????????????? 110010 
addi r8, r8, %lo(label) --> 01000 01000 1100001101010000 000100 
subi r8, r8, 1 --> 01000 01000 1111111111111111 000100 
bne r8, r0, START_TIMER --> 01000 00000 1111011010001100 011110 

在考慮中的線,我有麻煩是IMM16在這一個:

orhi r8, r0, %hiadj(label) 

如上鍊接的手冊說明,「%LO」裝置「immed32的提取位[15..0]」和「%hiadj」表示「提取位[31..16]並添加immed32的位15」。但是,二進制中的50000是1100001101010000,因此是16位數字。據我所知,它不包含16到31之間的任何位。我嘗試使用0000000000000001,但它不正確。

我在做什麼錯?

編輯: 只是爲了清除任何誤解;我只想知道如何手動編譯「orhi r8,r0,%hiadj(標籤)」。變量「r8」,「r0」和「標籤」如上所述並且不變。

編輯2: 我已經試過是把50000到32位二進制:

00000000000000001100001101010000 

...提取位[31 ... 16]:

0000000000000000 

...添加位15(這是令人困惑的,因爲他們不告訴我它是否值得2^15或2^0,我已經試過並且根本不添加)

0000000000000001 
1000000000000000 
0000000000000000 

全部不正確。

編輯3: 根據this link,當16位值是0x8000或更高,它的其餘部分跡象-延伸到0xffff8000和加上1位[31 ... 16],其過載數0x100008000〜0x00008000,這就是你說的傑拉德,但顯然仍然不正確。

回答

0

您提供的代碼將「label」處的值作爲16位半字,並將其擴展爲32位字以成爲地址。由於您的標籤是16位值,因此您必須將零移入寄存器的上半部分。

所以,你想要做什麼是負載零到高位,然後在低位添加...

orhi r8, r0, %hiadj(label) --> 00000 01000 0000000000000000 110010 
addi r8, r8, %lo(label) --> 01000 01000 1100001101010000 000100 
+1

「orhi」和「阿迪」是僞指令「MOVIA」的一部分( movia r8,50000),因此在「addi」之前直接出現。除此之外,沒有其他說明提供給我,所以它不是一個完整的程序,只是一個片段。 當你說「移位高達[31 ... 16]」,你的意思是我應該把它變成11000011010100000000000000000000?我在裝配編程方面很新,所以請耐心等待。 – 2012-10-11 22:08:31

+0

@John,我更新了答案。試試看。 –

+0

謝謝,但那也不正確。我感到困惑,因爲它說「提取位[31 ... 16](全爲零)並添加位15」。由於位15已經是1,它應該繼續到位16,因此是000000000000001,但是這兩個都不正確... – 2012-10-12 09:25:29