2013-01-21 34 views
0

我寫簡單的組裝SMIPS測試要在HDL定義的處理器上運行。大會地址:標籤與絕對地址

比如我有下面的代碼應該產生一個溢出異常:

main: 

     #Test Overflow Exception 

     addi $2, $0, 0xffffffff 
     addi $3, $2, 0x1 

我知道,如果處理器是做正確的事情,它應該重定向到它被放置在地址0xdeadbeef處理程序。我只知道爲跳躍中加入以下代碼上面添加標籤:

overflowHandler: 
     addiu $5 $0, 1 
     bne $0, $5, pass 

有沒有一種方法,使在正確0xdeadbeef地址overflowHandler代碼開始? 主要從地址0開始?

編輯:(I具有優於在HDL描述的從處理器跳轉地址控制)

由於我必須在從在Bluespec公司處理器設計的描述處理器跳轉地址控制,我可以更改爲整除4並跳到更近的更方便的位置。所以我的問題是:地址從主地址0x0開始計數? 什麼是最佳解決方案? :改變地址跳轉,還是標籤對應它?

由於提前,

+0

是否有操作系統?或者*你正在編寫一個操作系統? –

+1

這取決於裝載機和工具鏈。通常的方法是使用部分並告訴鏈接器將其放在所需的地址。順便說一下,你的測試是錯誤的,因爲無符號操作顯式地執行** not **產生溢出異常。 – Jester

+0

如果這是真正的MIPS代碼,則處理器不能跳轉到地址0xdeadbeef,因爲該地址未在4字節邊界上對齊。使用'0xdeadbeec'或'0xdeadbef0'可以工作。 – markgz

回答

0

由於您的處理器在Bluespec公司模仿,似乎要執行的代碼將在得到加載到用Verilog的$readmemh()功能,其內容包含內存內容的文本文件,該處理器的存儲器。由Bluespec模型創建者決定使用文本文件中的$readmemh()函數和地址說明符的參數來加載代碼的位置。

與存儲器內容創建文本文件的最簡單的方法是通過MIPS彙編程序來運行你的彙編源代碼和彙編程序的源代碼上市提取十六進制操作碼。

問題:「地址開始從地址0x0計數?」

MIPS處理器開始於0x1cf00000執行代碼時,它被複位。 (A Simple MIPS處理器在重置時從0x00001000開始)。您通常會在復位地址跳轉到測試程序的開始位置。如果你加載的地址爲0x0JR $zero應該執行的測試程序應該工作。測試程序中

分行都應該是相對地址,所以你不需要做什麼特別的測試代碼中指定標籤的地址。如果您需要跳轉到合格或不合格的已知位置,做這樣的事情(假設PASS是在地址0x4000):

LI $t0, 0x4000 
JR $t0 
0

這個問題不回答非常明確。通常,某些標籤的地址由彙編器(和/或鏈接器)自動分配,並取決於許多因素。

彙編器總是有一些指令,它允許程序員控制在一定程度上在碼和標籤被放置在地址空間。 「org」指令通常用於設置組裝過程的當前地址。

在大多數彙編程序中,以下代碼將標籤overflowHandler設置爲0xdeadbeef。

    org 0xdeadbeef ; or any other number 
overflowHandler: 
        ; some code here 

但是,它又取決於特定的彙編語法(它們通常在不同的實現中是不同的)。 另一個問題是,即使正確編譯,代碼也必須在正確地址的內存中加載。此任務不是彙編程序任務,而是鏈接程序OS的任務,並且也取決於所使用的二進制文件格式。

請注意,在大多數操作系統中,程序員不能自由選擇加載某些二進制文件的地址。

這裏的正確方法是仔細學習項目使用的工具 - 彙編語法(我的意思是彙編程序指令,而不是處理器指令),鏈接器功能,使用的二進制格式以及將加載此操作系統函數的操作系統函數代碼執行。