2011-01-26 113 views
3

我正在爲一個硬件分配編寫一個Linux引導程序,我知道我需要創建一個函數來讀寫內存中的一個字。我無法確定我是否在正確的軌道上,並且任何幫助都很大。我會測試這些功能,但目前對我來說是不可能的,因爲我需要在構建核心功能之前開展工作,然後才能將所有功能放在一起。我得到了get_byte(段偏移量)/ put_byte(焦炭,段偏移量)被證實由我的老師一起工作,從彙編語言編寫,並出口到C.C Linux從內存讀取/寫入字段(段,偏移量)

unsigned short get_word(unsigned short segment, unsigned short offset) 
{ 
unsigned short word, low, hi; 
    low = get_byte(segment, offset); 
    high = get_byte(segment, offset+1); 
    word = low+hi; 
    return word; 
} 

我不知道,如果上面是正確。我知道嗨和低需要結合,可以添加,或者我應該只是做低&嗨,然後返回該結果?如果我完全脫離基地,請告訴我。偏移量無符號短還是int應該是正確的?

int put_word(unsigned short word, unsigned short segment, unsigned short offset) 
{ 
    unsigned short low, hi; 
    low = word | offset; 
    hi = word | offset+1 
    put_byte(segment, low); 
    put_byte(segment, hi); 
    return 0; 
} 

我不知道上面的代碼是否接近正確,但這是我最好的猜測。

任何人都知道解決方案或有任何提示?這些功能應該是非常基本的,但我被卡住了,需要開始我的任務的實際部分。

UPDATE(12:46):修正put_byte(),如下所述,只接受兩個參數是沒有意義的,修正了這個問題。我爲我的錯誤道歉。

+0

男人我很想看看在Linux上工作的get_byte和put_byte。 – Joshua 2011-01-26 21:02:19

回答

3

get_word()

word = (high << 8) | low 

put_word()

low = word & 0xff; 
hi = word >> 8; 
put_byte(low, segment, offset); 
put_byte(hi, segment, offset+1; 

我懷疑put_byte只需要兩個參數,如你所說。這是沒有道理的。

+0

被毆打幾秒..;) – BlackBear 2011-01-26 20:44:55

+0

是的 - 實際上,字節序由get_byte/put_byte處理,所以他排序了那一個。計算低/高時它不起作用。 – 2011-01-26 20:47:22

2

他們錯了。爲了使一個字開始用2個字節,你必須:

word = (byte2 << 8) | byte1 

假設字節2內存如下字節1,你想在小尾數「格式」你的話。 要在2個字節分成一個字,你必須:

byte1 = word & 0xff 
byte2 = word >> 8 

隨着上述考慮。