LINUX.ORG.RU

Зацените креатифф :) Insertion sort на avr ассемблере

 , ,


0

2

Решил из любви к искусству написать сабж. Реализация примитивнейшего алгоритма внезапно оказалась мозговзрывательным занятием на целый день (параллельно с чтением толксов)

Протестил на atmega8515, вроде работает

insertion_sort: ; X - адрес буфера в RAM, r18 - размер буфера в байтах
adiw XH:XL,1
mov r19, r18;  r19 - счётчик внешнего цикла
dec r19
_insertion_sort_loop:
	breq _insertion_sort_end
	movw YH:YL, XH:XL
	subi YH:YL,1
	ld r20,X+
	mov r16, r18
	sub r16, r19 ; r16 - счётчик внутреннего цикла
	_insertion_sort_loop2:
		breq _insertion_sort_loop2_end
 		ld r17, Y
		cp r20, r17
		brsh _insertion_sort_loop2_end
		std Y+1, r17
		subi YH:YL,1
		dec r16
		rjmp _insertion_sort_loop2
	_insertion_sort_loop2_end:
	std Y+1,r20
	dec r19
	rjmp _insertion_sort_loop
_insertion_sort_end:
ret

Кто тут есть из любителей AVR, какие улучшения ещё можно сделать в плане уменьшения количества инструкций, используемых регистров или просто чтоб красивее выглядело?

★★★★★

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

сезон сейчас для домашних работ не тот

Harald ★★★★★
() автор топика

а теперь то же самое для 16- и 32-разрядных чисел и начинаем любить Cи :)

зы. сделай реализацию на C, gcc -S её, и посмотри. заодно можешь потягаться в скорости с компилятором (хотя, для AVR это не интересно, с x86 куда интереснее)

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

везде Ъ, не слушай всяких идиотов

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

потомутчо не всякие процессоры cisc с сложными командами

anonymous
()
Ответ на: комментарий от vzzo

это наверное его очередной клон, прости б-же.

anonymous
()
Ответ на: комментарий от Deleted

Любопытства ради, а какая разница? Что jmp, что goto - безусловный переход, теоретически ненужный, но практически иногда полезный. Если сильно захотеть, можно извратится и без jmp писать.

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

Если сильно захотеть, можно извратится и без jmp писать

ути какой упоротый, скажу тебе по секрету через unconditional branch даже режимы процессора переключаются (не на AVR конечно), так что и запись в PC в пролете.

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

Ключевые слова были - извратится и сильно захотеть. А собственно вопрос, почему jmp != goto. Так сказать, для просвещения. Я как темная и необразованная личность разницы не вижу - для меня что то, что это есть как ты выразился unconditional branch.

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

Ключевые слова были - извратится и сильно захотеть

просто не надо все под одну гребенку чесать - в жизни все намного сложней чем черное и белое

Я как темная и необразованная личность разницы не вижу - для меня что то, что это есть как ты выразился unconditional branch

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Cihfddaf...

B, BL, BX, BLX, and BXJ Branch, Branch with Link, Branch and exchange instruction set, Branch with Link and exchange instruction set, Branch and change to Jazelle state. ... cond is not available on all forms of this instruction.

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

cond is an optional condition code. cond is not available on all forms of this instruction.

Не понял. Как мне увиделось, cond это какя то инструкция (или дополнение к инструкции, черт твой ARM знает, может там таймслоты есть), и никакую нельзя в условное ветвление.

Там еще есть табличка:

Table 12 shows the instructions that are available in ARM and Thumb state.

Вот совсем ничего не знаю про ARM. У него есть состояния в которых условные переходы запрещены и можно только jmp?

naszar
()

А-а, ассемблер с отступами как фпитоне!

просто чтоб красивее выглядело?

Выглядит и так очень красиво

anonymous
()
Ответ на: комментарий от naszar

Не понял.

это все безусловные переходы - типа аналог goto в яву, только смысл их (кроме b) отличается от простого goto чуть менее чем полностью.

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

Не, это это и я со своими скудными знаниями понимаю. Я втупил именно в вопросе jmp != goto. Когда jmp это просто безусловный переход, который ничего окромя pc(счетчика инструкций) не меняет. В твоем случае B.BL - это уже совсем другое. Какой это безусловный переход, когда можно вернутся. Все семейство инструкций ветвлений не интересует.

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

это это и я со своими скудными знаниями понимаю

да нихера ты не понимаешь и не поймешь, потому что соображаешь туго и только терминами предметной области в которой обезьянишь, bx - безусловный переход но одновременно переключение между arm и thumb, bxj - это вообще безусловный переход с переключением на jazelle. Изобрази это простым goto - это же для тебя одно и тоже - безусловный переход.

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

Угу. Вот теперь понял, что безусловный переход может осуществлять не только переход, но и выполнять некое низкоуровневое действие. А какое низкоуровневое действие выполняет jmp на x86? Зачем его столько:

$ objdump -d `whereis objdump`|grep "jmp "|wc -l
428

naszar
()
Ответ на: комментарий от anonymous

Выглядит и так очень красиво

То есть я AVR-ассемблера не знаю, выглядит загадочно и серьезно. Вот так можно сделать на i386

        /* ecx: N, ebx: uint32 *data; */
        movl    %ecx, %edx

next:
        movl    (%ebx), %eax
        cmpl    %eax, 4(%ebx)
        jge     sorted

        xchg    %eax, 4(%ebx)
        movl    %eax, (%ebx)

        cmpl    %ecx, %edx
        je      sorted

        incl    %ecx
        subl    $4, %ebx
        jmp     next

sorted:
        addl    $4, %ebx
        decl    %ecx
        jnz     next
        ret

Написание заняло почти 2 часа с перерывами. i386 мне кажется попроще

anonymous
()
Ответ на: комментарий от vvviperrr

Вот как раз в карго-культ и магические обряды не надо идеи Дейкстры превращать. Если ты прислушивался в первую очередь не к форме, а к сути, к аргументам, то должен был увидеть, что они и для сишных гото в равной степени справедливы.

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

А какое низкоуровневое действие выполняет jmp на x86?

Никакое. Единственное отличие от сишного goto в том, что адрес может быть в регистре или памяти, константными метками дело не ограничивается.

Зачем его столько

Чаще всего это switch и tailcall, ну или блоки для пущей локальности хитро сгруппированы.

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