我正在为一个硬件分配编程一个Linux引导程序,我知道我需要创build一个函数来读/写一个字到内存。 我很难确定我是否在正确的轨道上,任何帮助都很好。 我会testing这些function,但在这个时候对我来说是不可能的,因为在将所有东西放在一起之前,我需要去构build核心function。 我得到了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; }
我不确定以上是否正确。 我知道嗨和低需要结合,可以添加,或者我应该简单地做低和喜,然后返回该结果? 如果我完全脱离基地,让我知道。 偏移是否正确无符号短或应该是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; }
我不知道上面的代码是否接近正确,但这是我最好的猜测。
任何人都知道解决scheme或有任何提示? 这些function应该是非常基本的,但我卡住了,需要开始我的任务的实际部分。
更新(12:46):修正put_byte(),如下所述,只接受两个参数是没有意义的。 我为我的错误道歉。
在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个字节,你必须:
word = (byte2 << 8) | byte1
假设字节2在内存中跟随字节1,并且您希望您的单词处于小尾数“格式”。 要分割2个字节的单词,你必须:
byte1 = word & 0xff byte2 = word >> 8
有了上面的考虑。