C Linux чтение / запись слова из памяти (сегмент, смещение) - PullRequest
3 голосов
/ 26 января 2011

Я работаю над программированием загрузчика Linux для назначения HW и знаю, что мне нужно создать функцию, которая будет читать / записывать слова из / в память.У меня возникают проблемы с определением, нахожусь ли я на правильном пути или нет, и любая помощь будет отличной.Я бы протестировал эти функции, но в настоящее время это невозможно для меня, так как мне нужно поработать над созданием основных функций, прежде чем я смогу собрать все воедино.Мне дали get_byte (сегмент, смещение) / put_byte (символ, сегмент, смещение), которые были проверены моим учителем для работы с кодом из сборки и экспортированы в 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;
}

Я понятия не имею, является ли приведенный выше код чем-то близким к правильному, но это мое лучшее предположение.Кто-нибудь знает решение или есть какие-либо советы?Эти функции должны быть довольно простыми, но я застрял и должен приступить к реальной части моего назначения.

ОБНОВЛЕНИЕ (12:46): Исправлена ​​put_byte (), как указано ниже, это не будет делатьсмысл принимать только два аргумента, исправил это.Я прошу прощения за свою ошибку.

Ответы [ 2 ]

3 голосов
/ 26 января 2011

В 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 голосов
/ 26 января 2011

Они не правы.Чтобы составить слово, начинающееся с 2 байтов, вы должны:

word = (byte2 << 8) | byte1

при условии, что byte2 следует за байтом 1 в памяти, и вы хотите, чтобы ваше слово было в формате с прямым порядком байтов.Чтобы разделить слово на 2 байта, вы должны:

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

С учетом вышеизложенного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...