3

ハードウェア割り当て用の Linux ブーターのプログラミングに取り組んでおり、メモリとの間で単語を読み書きする関数を作成する必要があることを知っています。私が正しい軌道に乗っているかどうかを判断するのに苦労しています。これらの機能をテストしたいのですが、すべてをまとめる前にコア機能の構築に取り組む必要があるため、現時点では不可能です。get_byte(segment,offset)/put_byte(char,segment,offset) が与えられ、アセンブリからコード化され、C にエクスポートされた教師によって動作することが確認されました。

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;
}

上記が正しいかどうかはわかりません。ハイとローを組み合わせる必要があることはわかっています。追加しても問題ありませんか、それとも単にローとハイを実行してその結果を返す必要がありますか? 私が完全にベースから外れている場合は、お知らせください。オフセットが unsigned short であることは正しいですか、それとも 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;
}

上記のコードが正しいことに近いかどうかはわかりませんが、私の最善の推測です。

解決策を知っている人、またはヒントを持っている人はいますか? これらの関数は非常に基本的なものである必要がありますが、行き詰まっており、割り当ての実際の部分に取りかかる必要があります。

更新 (12:46): put_byte() を修正しました。以下に示すように、2 つの引数のみを受け入れるのは意味がありません。これを修正しました。私の間違いをお詫び申し上げます。

4

2 に答える 2

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あなたが述べたように、それが2つの引数しかとらないとは思えません。それは意味がありません。

于 2011-01-26T20:42:50.853 に答える
2

彼らは間違っています。2 バイトで始まる単語を作成するには、次のことを行う必要があります。

word = (byte2 << 8) | byte1

byte2 がメモリ内で byte1 に続き、単語をリトルエンディアンの「形式」にする必要があると仮定します。単語を 2 バイトに分割するには、次のことを行う必要があります。

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

上記の考慮事項で。

于 2011-01-26T20:43:12.240 に答える