roboforum.ru

Технический форум по робототехнике.
Текущее время: 19 май 2025, 20:39

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 00:32 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
Помогите перевести строки АСМ
Код:
IORLW 0x00           ;   b'00000000'  d'000'
BTFSS STATUS,Z       ; !!Bank!! STATUS - STATUS - RAM - RAM
GOTO LADR_0x01DA
BSF LRAM_0x64,1

в си.
Не пойму как выразить в if(); вот эти строки IORLW 0x00; BTFSS STATUS,Z;
И еще вопрос правильно ли я перевел вот эти строки
Код:
XORWF LRAM_0x5B,W
BTFSS STATUS,Z       ; !!Bank!! STATUS - STATUS - RAM - RAM
RETLW 0x00           ;   b'00000000'  d'000'

я сделал так
Код:
W=(LRAM_0x5B^W); //значение в регистре 0x5B ксорим со считанным значением в регистре W и сохраняем в W
if(W!=0) //если значение не равно 0 то делаем ьо что в скобках
{
W=0x00;
break; //остановить выполнение функции
}

Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 01:01 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Raf00084 писал(а):
Не пойму как выразить в if(); вот эти строки IORLW 0x00; BTFSS STATUS,Z;


IORLW 0x00 делает "логическое или" w с константой 0х00, т.к. константа - зеро, то реального изменения w не происходит, только изменяются биты статуса. Мягко говоря, это просто проверка w на ноль. Т.е. всю строку читать так: Проверить w на ноль (IORLW 0x00), если результат равен нулю, то пропустить след. команду (BTFSS STATUS,Z). Т.к. след. команда - переход (GOTO LADR_0x01DA), то можно читать так: если w !0, то переход на LADR_0x01DA.

Raf00084 писал(а):
И еще вопрос правильно ли я перевел вот эти строки

В общем правильно. Это просто сравнение 2-х чисел. Можно так: if(W!=LRAM_0x5B)
RETLW 0x00 - пережиток системы команд древних пиков. Сейчас в пиках есть return.

По стилю кода, могу точно сказать, что в той жизни эта программа была написана на си.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 01:26 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
Спасибо огромное! Да может она и была написана на си, у меня на руках считанная прошивка и дезасеблирована, теперь опять перевожу на си, исходника нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 01:58 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Да я понял, что это продолжение темы:
http://roboforum.ru/forum60/topic15105.html
Сколько кб. прошивка?
Могу только пожелать удачи в этом сложном деле... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 11:37 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
Raf00084 писал(а):
break; //остановить выполнение функции

это не правильная интерпретация! бреак делает выход из циклов, а не из функций!

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 11:52 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Зависит от контекста. Если в функции больше нет кода, то выход из цикла - выход из функции :wink:
Поэтому я и ограничился описанием if(). Вопросов к переводу асм в си очень много, например, как интерпретировать работу с аккумулятором "w"? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 12:06 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
gcc вообще отказалось компилировать break без циклов
m.c:6:1: error: break statement not within loop or switch
break;
^

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 12:19 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Romikgy писал(а):
gcc вообще отказалось компилировать break без циклов

А ты "if() {break;}" в цикл-то засунь...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 12:55 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
пофигу, та же ошибка
а вот если в while(){break;} , тогда все хорошо , но из функции не выйдет !

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 13:13 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Да с чего ему не работать? :shock:
Это в "GNU C Compiler version 4.8.2" работает:
Код:
#include <stdio.h>
int main (void)
{
   unsigned int i;
   for (i = 0; i < 8; i++)
   {
      if(i==4) {break;}
      printf ("Hello World\n");
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 13:55 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
Dmitry__ писал(а):
for (i = 0; i < 8; i++)

ибо for это аналог while , а без for попробуйте !!! удивитесь!

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 14:15 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
Tролль 80 lvl :o
Все работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 14:26 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
for ни разу не аналог while, не прикалывайтесь, это просто другая конструкция. на break по хорошему должна ошибка быть, хотя фиг его знает, может можно и отучить. а вообще кроме break есть return, часть кода при компиляции могли быть просто выкинуты, в оригинале могли быть вставки асма + особенности конкретного компилятора с определёнными настройками под определённый проц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 16:43 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
Dmitry__ писал(а):
Tролль 80 lvl :o
Все работает.

иль ваш компилятор умный больно , иль это вы Tролль 80 lvl ....
PS для нормального возврата из функции , нормальные программисты используют return!

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод ASM в СИ
СообщениеДобавлено: 12 мар 2015, 17:12 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
это реверс, что там изначально в сях по феншую должно было быть, значения не имеет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO