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

我不确定上述是否正确。我知道 hi 和 low 需要结合起来,可以添加还是我应该简单地做 low & hi 然后返回结果?如果我完全不在基地,请告诉我。offset 是 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(),如下所述,只接受两个参数是没有意义的,修复了它。我为我的错误道歉。

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正如你所说,我怀疑这只需要两个论点。这没有任何意义。

于 2011-01-26T20:42:50.853 回答
2

他们错了。为了使单词以 2 个字节开头,您必须:

word = (byte2 << 8) | byte1

假设 byte2 在内存中跟随 byte1 并且您希望您的单词采用 little-endian “格式”。要将单词分成 2 个字节,您必须:

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

有了上面的考虑。

于 2011-01-26T20:43:12.240 回答