Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переписать функцию из C++ на ASM

311
28 января 2015 года
plastictown
309 / / 08.01.2006
Доброго времени суток, господа форумчане!
Я написал прошивку для контроллера на Turbo C++ 3.0 и пытаюсь на сколько это возможно переписать на inline-ассемблере.
Я вроде бы попробовал, но компилятор ругается и говорит, что не видит метки, а без джампов я этого сделать не смогу.
Скажите, пожалуйста, как пишутся метки в BASM, а может и помогите кто чем может:)


Код:
unsigned char MakeState8Bit(unsigned int digit)
{

    register unsigned int arr=256;
    register unsigned char c=0;
    register unsigned char cmpr=1;

    while (arr<=16384)
    {
        if(digit&arr) c|=cmpr;

        arr<<=1;
        cmpr<<=1;
    }

    return c;
}

unsigned short MakeState16Bit(unsigned short digit)
{

    register unsigned long arr=256;
    register unsigned short s=0;
    register unsigned short cmpr=1;

    while (arr<=268435456L)
    {
        if(digit&arr) s|=cmpr;

        arr<<=1;
        cmpr<<=1;
    }

    return s;
}
ЗЫ: функции получают состояние ног контроллера и переделывают как мне надо.
311
29 января 2015 года
plastictown
309 / / 08.01.2006
Всем спасибо! На RSDN помогли: если метки выносить за блок asm, то все работает.

Код:
_asm {
...
...
...
}
Label:
_asm {
...
...
loop Label
}
Компилятор BC++ 3.1. В сгенерированном asm-файле метки вот такие: @37@338, но внутри блока тоже не работают.
392
28 января 2015 года
cronya
421 / / 03.01.2009
Код:
int main()
{
    _asm
    {
        mov al, 0
        mov bl, 3      
procedure:
        cmp al, bl
        jne mJne
        jmp END
mJne:
        inc al
        loop procedure
END:

    };
    return 0;
}
311
28 января 2015 года
plastictown
309 / / 08.01.2006
Цитата: cronya
Код:
int main()
{
    _asm
    {
        mov al, 0
        mov bl, 3      
procedure:
        cmp al, bl
        jne mJne
        jmp END
mJne:
        inc al
        loop procedure
END:

    };
    return 0;
}



Вот в этом, собственно, и проблема:

260
28 января 2015 года
Ramon
1.1K / / 16.08.2003
Аудитория интересуется целью вашего соревнования с компилятором. Ибо в итоге то что вы напишите уступит компилятору либо это будут исходники уже не на C, тогда ризонный вопрос - а может тупо на ассемблере написать?
392
28 января 2015 года
cronya
421 / / 03.01.2009
Цитата: Ramon
Аудитория интересуется целью вашего соревнования с компилятором. Ибо в итоге то что вы напишите уступит компилятору либо это будут исходники уже не на C, тогда ризонный вопрос - а может тупо на ассемблере написать?


+1
Еще к чему привязка к мат среде, нету других IDE что ли?

326
28 января 2015 года
sadovoya
757 / / 19.11.2005
А компилятор в Turbo C++ 3.0 хороший код генерит, оптимизирует? Если вам с ним соревноваться слабо, то доверьтесь компилятору. Если считаете, что на асме можете его переплюнуть, то учитывая, что это вся ваша программа - перепишите на чистый ассемблер: как верно вам заметили - в чем смысл вставки делать, если программа в сплошную вставку превращается, от си ничего не остается.
311
28 января 2015 года
plastictown
309 / / 08.01.2006
В мануале к ICP DAS i-7188 сказано юзать TurboC/C++ или допотопный MSVCPP и библиотечки в комплекте. Не уверен, что контроллер захавает TASM-овый exeшник, хотя кто его знает, но всю прогу переписывать мне долго, т.к. :
Цитата:
учитывая, что это вся ваша программа


Это далеко-далеко не вся программа, а один из кусков, которые хотелось бы видеть на asm. А еще вычисление crc16 и много чего еще, что вызывается чаще всего.

326
28 января 2015 года
sadovoya
757 / / 19.11.2005
Попробуйте на старом tasm-e сделать объектники для ф-ций, которые хотите оптимизировать. Вероятно они соберутся с остальной программой. Для начала что-нибудь элементарное, крохотное - просто, чтобы проверить сборочность с объектниками.
О метках: попробуйте метки с приставкой @ сделать. Или джампы по смещению в адресах типа jmp +$04 (вперед на 4 байта). Хотя могу ошибаться, но попробовать можно.
260
28 января 2015 года
Ramon
1.1K / / 16.08.2003
Цитата: plastictown
В мануале к ICP DAS i-7188 сказано юзать TurboC/C++ или допотопный MSVCPP и библиотечки в комплекте. Не уверен, что контроллер захавает TASM-овый exeшник, хотя кто его знает, но всю прогу переписывать мне долго, т.к. :
Цитата:
учитывая, что это вся ваша программа


Это далеко-далеко не вся программа, а один из кусков, которые хотелось бы видеть на asm. А еще вычисление crc16 и много чего еще, что вызывается чаще всего.



Внезапно в TurboC шел стандартный TASM. И для справки TurboC считается лучшим 16 битным компилятором для x86 включая кодогенерацию. Так же сомнительно что ваш подсчет CRC на ассемблере будет быстрее нежели простой табличный способ.

PS: Цель соревнования так раскрыта и не была

327
28 января 2015 года
UserNet2008
748 / / 03.04.2010
 
Код:
@@procedure:
    ;* ваш код
   
    loop @@procedure
В принципе можно использовать любые два символа типа так - @@ ZZ и т.д
311
29 января 2015 года
plastictown
309 / / 08.01.2006
Цитата: UserNet2008
 
Код:
@@procedure:
    ;* ваш код
   
    loop @@procedure
В принципе можно использовать любые два символа типа так - @@ ZZ и т.д



Error: Undefined label @@procedure.

311
29 января 2015 года
plastictown
309 / / 08.01.2006
Внезапно в TurboC шел стандартный TASM. И для справки TurboC считается лучшим 16 битным компилятором для x86 включая кодогенерацию. Так же сомнительно что ваш подсчет CRC на ассемблере будет быстрее нежели простой табличный способ.

PS: Цель соревнования так раскрыта и не была[/quote]

За справку спасибо, хорошо бы без выпендрежу.
Цель: по возможности увеличить скорость, уменьшить объем, все операции с сопроцессором прописать руками на асме в любом случае придется, по этому поводу свои заморочки.
260
29 января 2015 года
Ramon
1.1K / / 16.08.2003
Цитата: plastictown
Цитата:
Внезапно в TurboC шел стандартный TASM. И для справки TurboC считается лучшим 16 битным компилятором для x86 включая кодогенерацию. Так же сомнительно что ваш подсчет CRC на ассемблере будет быстрее нежели простой табличный способ.

PS: Цель соревнования так раскрыта и не была



За справку спасибо, хорошо бы без выпендрежу.
Цель: по возможности увеличить скорость, уменьшить объем, все операции с сопроцессором прописать руками на асме в любом случае придется, по этому поводу свои заморочки.



Вот только там нет сопроцессора.

1.8K
29 января 2015 года
Kuzya
184 / / 19.03.2008
А так _labelname: заюзать?
252
29 января 2015 года
koderAlex
1.4K / / 07.09.2005
установите опцию компилятора преобразовывать исходник в асм файл .
311
29 января 2015 года
plastictown
309 / / 08.01.2006
Цитата: Ramon
Вот только там нет сопроцессора.


Не так сказал. Все операции с плавающей точкой работают только между cli/sti, иначе контроллер виснет насмерть. Соответственно стоит режим эмуляции.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог