【问题标题】:C Linux read/write word from memory (segment,offset)C Linux 从内存中读/写字(段,偏移)
【发布时间】:2011-06-16 03:16:34
【问题描述】:

我正在编写一个用于硬件分配的 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(),如下所述,仅接受两个参数是没有意义的,已修复。我为我的错误道歉。

【问题讨论】:

  • 我很想看到在 Linux 上运行的 get_byte 和 put_byte。

标签: c linux memory offset segment


【解决方案1】:

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 只接受两个参数,正如你所说。这没有意义。

【讨论】:

  • 是的 - 实际上,字节序是由 get_byte / put_byte 处理的,所以他把那个排序了。在计算低/高时它不会起作用。
【解决方案2】:

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

word = (byte2 << 8) | byte1

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

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

以上考虑。

【讨论】:

  • 抱歉,我不能选择两个正确的答案。非常感谢您的帮助,过去几个小时一直在解决这个问题。
猜你喜欢
  • 2015-10-14
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多