在C语言中从内存(段,偏移量)读写字。

3

我正在为一项硬件作业编程Linux引导程序,我知道我需要创建一个函数来从/向内存中读写一个字。我现在遇到了困难,无法确定自己是否走在正确的轨道上,希望能得到任何帮助。我会测试这些函数,但目前还不可能,因为我需要先构建核心功能,然后再把所有东西放在一起。我的老师从汇编语言编写并导出到C的get_byte(segment,offset)/put_byte(char,segment,offset)已经被验证可以工作。

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

我不确定上面的是否正确。我知道需要将高位和低位组合起来,是添加还是简单地执行low&hi,然后返回结果?如果我完全错了,请让我知道。偏移量应该是无符号短整型还是整型?

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。 - Joshua
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只需要两个参数,这是不合理的。

是的 - 实际上,字节序由get_byte / put_byte处理,所以他解决了这个问题。在计算低位/高位时,它不起作用。 - Daniel Gehriger

2

他们是错的。如果想要一个以两个字节开头的单词,你需要:

word = (byte2 << 8) | byte1

假设byte1在内存中排在byte2的前面,且你想要按小端格式设置字(word)的顺序。若要将一个字拆分成2个字节,你需要执行以下步骤:
byte1 = word & 0xff
byte2 = word >> 8

考虑到上述因素。

很抱歉我没有选对两个答案。非常感谢您的帮助,虽然我已经花了几个小时来解决这个问题。 - user591162

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接