LINUX.ORG.RU
ФорумTalks

ASM vs C

 


1

3

Я как то был лучшего мнения о компиляторе GCС и его варианте gcc-avr.

Вняв, какой клевый язык C, и переписав программу на нем, я увидел ужасный, отвратительный ассемблерный код (даже с -O2), с диким количеством записи в память, и к тому же в несколько раз длиннее.

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

Ответ на: комментарий от Bad_ptr

Когда нужно дофига считать за короткий интервал времени преимуществ у Си перед асмом нет никаких.

luke ★★★★★
()
Ответ на: комментарий от luke

Соответственно — если нужны мегаоптимизации и результат работы компилятора Си не нравится — пусть пишет на асме.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Sadler

Кроме того, что асмокод требует зачастую куда большей силы воли для прочтения и отладки.

а вот нифига, если есть комментарии и он структурирован. Я с трудом понимаю, что там мне народил avr-gcc, но свой код понимаю легко

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Я с трудом понимаю, что там мне народил avr-gcc, но свой код понимаю легко

Вот-вот. Если ты один-единственный разработчик.

Sadler ★★★
()

Какие, однако, Ъ-кульхацкеры на ЛОРе!

Bioreactor ★★★★★
()

Вероятно код написан не-gcc-угодно. Многое можно исправить изменяя типы переменных, порядок действий и т.п.

Да, и где же пример такого кода?

amaora ★★
()
Ответ на: комментарий от Eddy_Em

ну вот сравни:

c2:     ; включаем катушку
        lds temp, 0x60
        lds t1, 0x61
        lds t2, 0x62

        andi cnd, 0b11111000
        ori cnd,  0b00000011

        andi PB, 0b11101111
        out PORTB, PB

        rjmp C_END

и


.L8:
/* #APP */
 ;  72 "prog.c" 1
        nop
 ;  0 "" 2
/* #NOAPP */
        ori r25,lo8(3)
        sts cnd,r25
        lds r24,tcat
        lds r25,tcat+1
        sts t+1,r25
        sts t,r24
        lds r24,tcat0
        sts temp,r24
        lds r22,PB
        andi r22,lo8(-17)
        rjmp .L14
cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Интересное кино. Под PIC и ARM я ассемблерные файлы смотрел — оптимизирует отлично.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Как не то?

Загружаем время из SRAM, сбрасываем 4-й бит в PB и выводим его в PORTB, младшие 3 бита cnd переводим в 011

еще я один кусочек потерял из того, что сделал gcc:

.L14:
        sts PB,r22
        in r24,0x18
        ldi r23,0
        ldi r25,0
        rcall outp
        rjmp .L13

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 3)
Ответ на: комментарий от AiFiLTr0

И это... почему-то у меня с разбором дизассембли проблем не бывает.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от cvs-255

tcat не константа, cnd надо заменить локальной переменной, дальше вижу совсем разный код на С и asm. Итог, gcc все сделал правильно.

amaora ★★
()
Ответ на: комментарий от amaora

tcat не константа,

конечно не константа. В моем ассемлерном коде она соответствует ячейкам памяти 0x62:0x61

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Ну, это понятно:

        andi cnd, 0b11111000   cnd &= 0xFC;
        ori cnd,  0b00000011   cnd |= 0x03;

        andi PB, 0b11101111    PB &= 0xEF;
        out PORTB, PB          outp(PORTB, PB);

А это — нет:

        lds temp, 0x60
        lds t1, 0x61
        lds t2, 0x62
Как оно связано с
        t = tcat;
        temp = tcat0;
???

// ассемблер я знаю «постольку поскольку», что такое lds — без понятия

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cvs-255

ну вот сравни: нечитаемое говно и нечитаемое говно

А ещё у тебя там код на половину из магических чисел.

Kalashnikov ★★★
()
Ответ на: комментарий от Eddy_Em

lds загружает величину из SRAM в регистр. 0x60:0x61:0x62 - ячейки, где хранится нужная величина.

t0, t1, t2 - счетчик времени. В ассемблерном варианте я загружаю в него нужное время

В сишном - счетчик - 2-х байтовый t и 1-байтовый temp. И загружаю я в него время из tcat и tcat0

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от amaora

Глобальные переменные в регистрах?

Да. Часто используемые (на самом деле на каждом срабатывании таймера) глобальные переменные я положил в регистры

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

GCC надо об этом тоже сказать было. Хотя у меня оно как-то не очень работало.

Это же означает, что регистр нигде более нельзя будет использовать.

amaora ★★
()
Последнее исправление: amaora (всего исправлений: 1)

В вашей задаче есть определенные требования быстродействия например в мс? Код на С им не удовлетворяет?

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

В вашей задаче есть определенные требования быстродействия например в мс?

Да. И код созданный gcc требует в ~3 раза больше тактов.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Sadler

Кроме того, что асмокод требует зачастую куда большей силы воли для прочтения и отладки.

Не знаю как для МК, под DOS это было далеко не всегда так. Разумеется, если асмовый код именно писался на асме, а не просто разворачивался из скомпилированного сишного .exe при помощи Sourcer или IDA.

yu-boot ★★★★
()
Ответ на: комментарий от cvs-255

Глобальный? Я как-то не парюсь и просто делаю глобальную переменную нужного типа. А тебе если в регистры хочется запихать — попробуй со всякими volatile или pragma'ми поиграться.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ilovewindows

А зачем nop ?

в качетве метки

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Ну, ХЗ. У меня проблема нехватки памяти стояла только в PIC, а проблемы нехватки быстродействия вообще никогда не было. Если тебе так критичны скорость и размер кода, что же — пиши на ассемблере, раз gcc -Os не выдает нужный код.

Eddy_Em ☆☆☆☆☆
()

Все фигня, пиши в машинных кодах.

devl547 ★★★★★
()
Ответ на: комментарий от cvs-255

Чисто для справки (исклбчительно судя по размеру этих примеров), есть ли реально ощутимая разница в скорости или потреблении памяти между ними? Какой исходник (на асме или на си) более нагляден?

cPunk ★★
()

пиши на ассемблере, С для больших железок

Harald ★★★★★
()
Ответ на: комментарий от amaora

Вероятно код написан не-gcc-угодно. Многое можно исправить изменяя типы переменных, порядок действий и т.п.

правильный путь, подправить gcc, чтобы он генерил код правильно.

dimon555 ★★★★★
()

Если после тебя этим никто никогда нигде не будет пользоваться - есть смысл пейсать на ассемблере

vasily_pupkin ★★★★★
()
Ответ на: комментарий от cPunk

есть ли реально ощутимая разница в скорости или потреблении памяти между ними?

в 3 раза.

cvs-255 ★★★★★
() автор топика

У меня -O3 давало ощутимую прибавку мозгов.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.