|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 2:16 am
оптимизация на асемблерски код
| Автор |
Съобщение |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
tgi, стига бе човече, нали и аз това казвам, вземи им обясни за 101-ви път, че да вземат да престанат да питат що е това асемблер и има ли почва у нас  В този ред мисли се сетих за един стар милиционерски виц
Влязъл един милиционер в баничарницата:
- Другарко, дайте ми е една баничка от 20ст !
- Другарю, нямаме банички от 20ст. !
- Другарко, казвах Ви, дайте ми една баничка от 20ст !!
- Другарю, казах Ви нямаме банички от 20ст !!
- Другарко, не ми излизайте с номера, че нямате банички от 20ст !
- А бе другарю, колко пъти да Ви казвам, че нямаме банички от 20ст  ?
В този момент влезнал началника на милицията и безпомощната продавачка се обърнала към него:
- Другарю началник, вашия подчинен иска банички от 20ст., ние не продаваме банички от 20ст., но
той упорито настоява да му дам баничка от 20ст., вземете му обяснете, че нямаме такива банички !
- А бе другарко, казал началника, какво му се обяснявате толкова, след като веднъж сте му обяснили,
че нямате банички от 20ст. ? Ми вземете една тава банички от 20ст. и го ударете у главата, да разбере
накрая, че нямате банички от 20ст. 
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Чет Дек 17, 2009 6:17 am |
|
 |
|
tgi
Ранг: Форумен бог
Регистриран на: Нед Юни 10, 2007 2:22 pm Мнения: 6492 Местоположение: София
|
LOL, нещо такова - бой с тавата по тиквата - върши работа при програмирането на кой
да е език.
На старата ми (голяма) чери клавиатура колко пъти са и се разхвърчавали копчетата....
Тия сега дето ползвам са едни малки, и те отнасят тавата с баничките, ама не хвърчат
(инак са доста по-келяви от голямата, ама заемат по-малко място и им свикнах).
_________________------------------- www.tgi-sci.com------------------- http://www.flickr.com/photos/didi_tgi/
|
| Чет Дек 17, 2009 7:19 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
@sthx, защо им подаде огънчето на пироманите? 
|
| Чет Дек 17, 2009 1:03 pm |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
E, не бях аз. Нали преди мене се опитвахте да давате направление в живота на michev. Решил си е човекът, че ще учи асемблер, пита конктретно, а вие му обяснявате, че няма смисъл . Ами обяснете ми и на мене, че няма смисъл да се програмира на асемблер. 
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Чет Дек 17, 2009 3:14 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
Да добавя малко - TST се ползва мнооого рядко
Примерно след shift - директно имаш BRCS или BRCC инструкции
Внимавай много с SBR, 1<<BIT7|1<<BIT0 ;тук можеш няколко бита да сетваш
SBRC, BIT7 ;тук проверяваш само един
SBI, BIT7 ;за I/O може само по битче да сетваш
Регистрите са 2 типа - до 15 и над 16 - внимавай с малките - не могат всичко
След като си Ц-програмист - малко ти трябва - дерзай!
|
| Чет Дек 17, 2009 8:38 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
"оптимизация на асемблерски код". Следващият епизод - "оптимизация на асемблерски данни". 
|
| Чет Дек 17, 2009 10:01 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
@woody, що да не? сигурно някой е написал макрос за __attribute__((packed)) 
|
| Чет Дек 17, 2009 10:57 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Дъ некст кусчън
Как да се провери 32 битово число дали е 0-а?
Успях да съчиня това, но не съм сигурен дали това е начинът.
Числото е разположено в r1, r2, r3 и r4
|
| Съб Дек 19, 2009 10:31 pm |
|
 |
|
tgi
Ранг: Форумен бог
Регистриран на: Нед Юни 10, 2007 2:22 pm Мнения: 6492 Местоположение: София
|
Не ти знам асемблера на процесора, но по принцип не се прави както си го съчинил.
Ето как - примерно числото е в r1-r4, r5 ти е непотребен (и процесорът ти не може
да прави операции между три регистъра като power - source1, source2, destination чешит).
move r1,r5
or r2,r5
or r3,r5
or. r4,r5
Очевидно стига ти само последнит ред да нагласи Z флага (или както му викат при тебе),
ако имаш контрол над това, инак пак става.
_________________------------------- www.tgi-sci.com------------------- http://www.flickr.com/photos/didi_tgi/
|
| Нед Дек 20, 2009 4:16 am |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
michev, не ги слушай непросветените. Оптимизация на асемблерен код може да има , стига да уточниш критериите - време за изпълнение и обем на кода. И оптимизация на данните може да има - поне на тяхното разположение в паметта. Непросветените, за които тези неща са без значение, да си драскат на каквото искат.
Конкретно на примера ти с риск да сгреша, защото не ти зная програмния модел на процесора.
Струва ми се, че имаш логическа грешка на последната проверка.
За по-бързо изпълнение , пък за по-малък код аз изпозвам 16 битов регистър - примерно индексния. Две последователни зареждания са достатъчни за проверката. Естествено проверяваните байтове трябва да са разположени един до друг, но щом това е число, явно е така. mov поне при процесорите, които ползвам , не спестява време и пространство, но инструкцията е удобна, защото не изисква акумулатор.
Ако имаш да правиш проверка , дали числото ти е FF, то можеш да го напрвиш с фиктивно увеличение с 1 - резултатът е нула и пак ти се вдига флага.
Ако имаш разклонение на програмата в зависимост от стойността на някакъв байт (примерно 0-5), вместо да го проверяваш конкретно за всяка стойност, по-бързо е, пък и по-кратко, ако заредиш го заредиш в акумулатора и след това последователно го намаляваш с 1. Ако резултатът е 0 при първоначалното зареждане, или след всяко изваждане , би трябвало и на твоя процесор да му се вдигне флага.
Под изваждане и събиране на 1 имай предвид dec и inc инструкциийте.
Разгледай спокойно инструкциите на процесора, обърни внимание кои флагове вдигат, за колко време се изпълняват и колко байта изискват.
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Нед Дек 20, 2009 9:42 am |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
по твоя начин:
tst r4
brne NO
tst r3
brne NO
tst r2
brne NO
tst r1
brne NO
YES:
.............
............
NO:
...........
по предложения от @tgi
clr temp //mov не вдига флагове
or temp, r4
or temp, r3
or temp, r2
or temp, r1
breq YES //или brne NO
ако не трябва съдържанието на регистрите след проверката:
or r4, r3
brne NO
or r2,r1
brne NO
YES:
.................
|
| Нед Дек 20, 2009 12:33 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
С или без Mov, не виждам какво ще ми помогне. Не виждам смисъл да се вдига какъвто и да е флаг, при зануляване на този регистър.
OR-a вдига флаг Z ако резултата е 0-а, но какво ще се получи ако r4=0x55, r3=0xFF, r2=0x12, r1=0x00? Няма ли последния OR да презапише Z флага и така да се получи грешен резултат?
Питам, защото според документацията - "Z: Set if the result is $00; cleared otherwise."
|
| Нед Дек 20, 2009 4:29 pm |
|
 |
|
tgi
Ранг: Форумен бог
Регистриран на: Нед Юни 10, 2007 2:22 pm Мнения: 6492 Местоположение: София
|
mov ти стига. Не трябва clr.
Първо помисли, тогава питай.
Интересува те Z флагът само след последната операция.
Помисли може ли резултатът от нея да е 0 ако някой от 4-те регистъра не е бил 0.
_________________------------------- www.tgi-sci.com------------------- http://www.flickr.com/photos/didi_tgi/
|
| Нед Дек 20, 2009 4:34 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Опс
Моя грешка.. леееко не съм дочел описанието на OR - "Performs the logical OR between the contents of register Rd and register Rr and places the result in the destination register Rd."
Работи както трябва и ще върши работа.
Благодаря!
|
| Нед Дек 20, 2009 4:44 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: Google [Bot] и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|