roboforum.ru

Технический форум по робототехнике.


Перевод ASM в СИ

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Перевод ASM в СИ

Сообщение Raf00084 » 12 мар 2015, 00:32

Помогите перевести строки АСМ
Код: Выделить всёРазвернуть
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; //остановить выполнение функции
}

Спасибо.
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 01:01

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.

По стилю кода, могу точно сказать, что в той жизни эта программа была написана на си.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Перевод ASM в СИ

Сообщение Raf00084 » 12 мар 2015, 01:26

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

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 01:58

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

Re: Перевод ASM в СИ

Сообщение Romikgy » 12 мар 2015, 11:37

Raf00084 писал(а):break; //остановить выполнение функции

это не правильная интерпретация! бреак делает выход из циклов, а не из функций!
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 11:52

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

Re: Перевод ASM в СИ

Сообщение Romikgy » 12 мар 2015, 12:06

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

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 12:19

Romikgy писал(а):gcc вообще отказалось компилировать break без циклов

А ты "if() {break;}" в цикл-то засунь...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Перевод ASM в СИ

Сообщение Romikgy » 12 мар 2015, 12:55

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

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 13:13

Да с чего ему не работать? :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");
   }
}
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Перевод ASM в СИ

Сообщение Romikgy » 12 мар 2015, 13:55

Dmitry__ писал(а): for (i = 0; i < 8; i++)

ибо for это аналог while , а без for попробуйте !!! удивитесь!
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Перевод ASM в СИ

Сообщение Dmitry__ » 12 мар 2015, 14:15

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

Re: Перевод ASM в СИ

Сообщение Angel71 » 12 мар 2015, 14:26

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

Re: Перевод ASM в СИ

Сообщение Romikgy » 12 мар 2015, 16:43

Dmitry__ писал(а):Tролль 80 lvl :o
Все работает.

иль ваш компилятор умный больно , иль это вы Tролль 80 lvl ....
PS для нормального возврата из функции , нормальные программисты используют return!
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Перевод ASM в СИ

Сообщение Angel71 » 12 мар 2015, 17:12

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

След.

Вернуться в Микроконтроллеры

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

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