Перейти к содержанию
    

Q: знатокам arm-вского ассемблера

Ну допустим. Тогда как проще (и желательно красивее) всего прочитать число допустим float с байтового адреса?
На ум пришло такое:

float val;
#pragma pack (push,1)
typedef struct {
   float  data;
}packed_float_t;
#pragma pack(pop)
float = ((packed_float_t *)getAddr())->data;
float = (*(packed_float_t *)getAddr()).data;

но не проверял. Если попробуешь, сообщи результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ

Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;)

Но скомпиленный код получился ужасный. Хотя корректный.

 

Через memcpy тоже вобщем нормально. Точнее не хуже этого.

 

Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну есть еще злой способ:

float getfloat(char *p)
{
#pragma pack(1)
union
{
  float x;
  struct
  {
    char c1;
    char c2;
    char c3;
    char c4;
  };
};
#pragma pack()
c1=*p++;
c2=*p++;
c3=*p++;
c4=*p;
return(x);
}

В иаре точно стрельнет, в остальных - скорее всего надо именовать юнион и структуру, что не меняет идеи ;)

Изменено пользователем Rst7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ

Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;)

Говорят, "у дураков мысли сходятся" :-) Однако продолжение почему-то забывают: "но у умных - чаще!"

Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка.
Вроде у Страуструпа читал, что если уж используешь явное преобразование указателей - сам смотри. Ведь в зависимости от контекста этот код может быть как абсолютно правильным (если этот char * в прошлой жизни был float *) и тогда предупреждения компилятора будут мешать или неправильным как в твоем случае. Видимо, придется просто запомнить, что в подобных случаях могут быть грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...