LINUX.ORG.RU

Поругайте код (x86-32)

 ,


0

2
global mymemcmp

mymemcmp:
	push ebp
	xor eax,eax
	mov ebp,esp
	push edi
	push esi
	mov ecx,[ebp+0x10]
	mov esi,[ebp+0x8]
	shr ecx,2
	mov edi,[ebp+0xc]
	test ecx,ecx
	repe cmpsd
	jz end_func
	sbb eax,eax
	or eax,1
end_func:
	pop esi
	pop edi
	pop ebp
	
	ret

Собственно, какие есть подводные камни кроме выравнивания? Вызывается так же как и стандартная memcmp() - два указателя и длина.


А чем стандартный не угодил?

zed_0xff
()

чем вызвано такое д..е форматирование?

mashina ★★★★★
()

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

amomymous ★★★
()

Видел где-то миф о том, что cmps/lods/stos медленнее mov+cmp/mov соответственно. Но сам не понимаю, почему - не мог бы кто-нибудь пояснить, кстати?

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

А с -03 или -fno-builtin разница есть?

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

уверен, что всё время вызывалась только твоя ф-я? gcc умеет инлайнить некоторые стандарные libc'шные вызовы на свои реализации.

mashina ★★★★★
()

Во-первых можно не делать фрейм, а первый аргумент брать как esp+0x10, все равно call'ов нет, как и вспомогательных пушей. Не видно cld (оно гарантировано?). Зачем test ecx,ecx? От нулевого ecx спасет только jz (не помню при rep там пре- или постпроверка). Кстати ты иногда выкидываешь 1-2-3 байта длины, это норм? Иначе add ecx,1, но тогда нужна проверка байтовых границ. И давно ходили слухи, что лучше обычный луп, чем repe, не знаю как сейчас.

В общем виде это вряд ли будет лучше чем в libc.

arturpub ★★
()

не понятно фраза «кроме выравнивания». Вы имеете ввиду только адреса, куда показывают указатели, или ещё и длину? Если длина не кратна четырём, то функция не учитывает «хвост».

rha
()

А с реализацией на Си сравнивал?

Waterlaz ★★★★★
()

Поругайте код

Код говно. Совсем плохой код. Бяка а не код.

Достаточно?

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