|
Q: знатокам arm-вского ассемблера |
|
|
|
Aug 5 2006, 16:54
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
есть команда STR R1, [R0, #0x0] при R1 = 0x00000000, R0 = 0x400002B5 пишет нули по адресу 0x400002B4 !!! Есть ли выравнивание по адресу записи?! Если это так, то надо аккуратно работать в keil'e с void-скими указателями
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Aug 5 2006, 17:33
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Цитата(abcdefg @ Aug 5 2006, 20:54)  есть команда STR R1, [R0, #0x0] при R1 = 0x00000000, R0 = 0x400002B5 пишет нули по адресу 0x400002B4 !!! Есть ли выравнивание по адресу записи?! Если это так, то надо аккуратно работать в keil'e с void-скими указателями  Data can be 8-bit bytes, 16-bit halfwords, or 32 bit doubles. Words MUST BE ALLIGNED to 4-byte boundaries, halfwords must be aligned to 2-byte boundaries И Keil тут не причем - архитектура однако
Сообщение отредактировал DASM - Aug 5 2006, 17:34
|
|
|
|
|
Aug 6 2006, 10:58
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(abcdefg @ Aug 5 2006, 19:54)  есть команда STR R1, [R0, #0x0] при R1 = 0x00000000, R0 = 0x400002B5 пишет нули по адресу 0x400002B4 !!! Есть ли выравнивание по адресу записи?! Если это так, то надо аккуратно работать в keil'e с void-скими указателями  А что вас так испугало? Читаем описание инструкции STR и видим там (документ ARM DDI 0100E стр. A4-89): Цитата Non word-aligned addresses STR instructions ignore the least significant two bits of address. So if these bits are not 0b00, the effects of STR are not precisely opposite to those of LDR. Так что для STR два младших бита игнорируются. А для LDR такое не прокатит, дата аборт сразу...
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 6 2006, 11:53
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(zltigo @ Aug 6 2006, 14:26)  Цитата(Rst7 @ Aug 6 2006, 13:58)  А что вас так испугало?
Очевидно получение неожиданного и без всяких предупреждений результата на ARM платформе (в отличие , например, от x86 платформы на которой обращение по невыровненному адресу хоть и медленнее, но корректно выполнится). И необходимость держать такой "нюанс" в голове программиста. Ну как сказать - неожиданный, на 68000 - аналогично, правда там exception и при записи происходит (а вот начиная с 030 - уже работает невыровненный доступ), PPC - тоже отказывается работать с невыровненными данными, да пожалуй все RISC такие; из классики - PDP11 - тоже самое, IBM360/370 - тоже, вот VAX - не помню. Так что x86 реально в меньшенстве...
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 6 2006, 18:00
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(DASM @ Aug 5 2006, 22:18)  гм.. ну так если Keil - у предложили указатель на void - то как бы чего он выравнивать то будет.... то есть смотря как этот указатель инициализировали.. а томже товарищ присвоил указателю адресу байтового массива, а переда его в функцию где int * хочетца ... голова что-то плохо с утра варит, но что-то в этом роде Была определена переменная типа: struct { byte field1; word field2; dword field3; } Var; Судя по всему, сама переменная выравнена по адресу, а вот поле field3 нет. В функцию передается адрес поля field3, который как раз и невыранен, из-за чего происходит глюк! Как с этим бороться, даже не знаю
|
|
|
|
|
Aug 7 2006, 03:22
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(abcdefg @ Aug 7 2006, 00:00)  Цитата(DASM @ Aug 5 2006, 22:18)  гм.. ну так если Keil - у предложили указатель на void - то как бы чего он выравнивать то будет.... то есть смотря как этот указатель инициализировали.. а томже товарищ присвоил указателю адресу байтового массива, а переда его в функцию где int * хочетца ... голова что-то плохо с утра варит, но что-то в этом роде
Была определена переменная типа: struct { byte field1; word field2; dword field3; } Var; Судя по всему, сама переменная выравнена по адресу, а вот поле field3 нет. В функцию передается адрес поля field3, который как раз и невыранен, из-за чего происходит глюк! Как с этим бороться, даже не знаю  Не должно такого быть, или приведите весь код, включая преобразования типов при обращении к структуре. Такое ощущение, что вы предварительно накладываете структуру на байтовый буфер, типичная ошибка.
--------------------
Пасу котов...
|
|
|
|
|
Aug 7 2006, 07:52
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(Andy Mozzhevilov @ Aug 7 2006, 07:22)  Не должно такого быть, или приведите весь код, включая преобразования типов при обращении к структуре. Такое ощущение, что вы предварительно накладываете структуру на байтовый буфер, типичная ошибка. Простейший пример: struct { byte field1; word field2; dword field3; } test_str; dword *ptr1= &(test_str.field3); test_str.field1 = 0x11; // ok test_str.field2 = 0x2233; // ok test_str.field3 = 0x44556677; // ok *ptr1 = 0x00000000; // bug, тут происходит запись в "выравненный адрес"
|
|
|
|
|
Aug 7 2006, 10:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Harbour @ Aug 7 2006, 12:36)  что-то видать намучено в linker script с align опцией Linker тут практически ни причем, поскольку оперирует линковкой сегментов. Ну а компилятор - в данном контексте имел возможность отругаться и не выдавать из пакованной структуры смещенный адрес dword. Никаких передач через void * или преобразования типов нет, все явно указано - мог, как минимум, предупредить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|