Технический форум по робототехнике.
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; //остановить выполнение функции
}
Спасибо.
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.
По стилю кода, могу точно сказать, что в той жизни эта программа была написана на си.
Raf00084 » 12 мар 2015, 01:26
Спасибо огромное! Да может она и была написана на си, у меня на руках считанная прошивка и дезасеблирована, теперь опять перевожу на си, исходника нет.
Dmitry__ » 12 мар 2015, 01:58
Да я понял, что это продолжение темы:
http://roboforum.ru/forum60/topic15105.htmlСколько кб. прошивка?
Могу только пожелать удачи в этом сложном деле...

Romikgy » 12 мар 2015, 11:37
Raf00084 писал(а):break; //остановить выполнение функции
это не правильная интерпретация! бреак делает выход из циклов, а не из функций!
Dmitry__ » 12 мар 2015, 11:52
Зависит от контекста. Если в функции больше нет кода, то выход из цикла - выход из функции
Поэтому я и ограничился описанием if(). Вопросов к переводу асм в си очень много, например, как интерпретировать работу с аккумулятором "w"?

Romikgy » 12 мар 2015, 12:06
gcc вообще отказалось компилировать break без циклов
m.c:6:1: error: break statement not within loop or switch
break;
^
Dmitry__ » 12 мар 2015, 12:19
Romikgy писал(а):gcc вообще отказалось компилировать break без циклов
А ты "if() {break;}" в цикл-то засунь...
Romikgy » 12 мар 2015, 12:55
пофигу, та же ошибка
а вот если в while(){break;} , тогда все хорошо , но из функции не выйдет !
Dmitry__ » 12 мар 2015, 13:13
Да с чего ему не работать?
Это в "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");
}
}
Romikgy » 12 мар 2015, 13:55
Dmitry__ писал(а): for (i = 0; i < 8; i++)
ибо for это аналог while , а без for попробуйте !!! удивитесь!
Dmitry__ » 12 мар 2015, 14:15
Tролль 80 lvl
Все работает.
Angel71 » 12 мар 2015, 14:26
for ни разу не аналог while, не прикалывайтесь, это просто другая конструкция. на break по хорошему должна ошибка быть, хотя фиг его знает, может можно и отучить. а вообще кроме break есть return, часть кода при компиляции могли быть просто выкинуты, в оригинале могли быть вставки асма + особенности конкретного компилятора с определёнными настройками под определённый проц.
Romikgy » 12 мар 2015, 16:43
Dmitry__ писал(а):Tролль 80 lvl
Все работает.
иль ваш компилятор умный больно , иль это вы Tролль 80 lvl ....
PS для нормального возврата из функции , нормальные программисты используют return!
Angel71 » 12 мар 2015, 17:12
это реверс, что там изначально в сях по феншую должно было быть, значения не имеет.