@ru_arduino

Страница 7616 из 7737
Keroronsk
01.10.2018
16:34:45
вроде похоже на правду..

Постите смешное!
01.10.2018
17:02:14
какая няша :3 https://youtu.be/OBl00R_ltdM

Remald
01.10.2018
17:10:32
народ, а использование стека при кодинге вложенных циклов на асме является нормой? нужно сохранить где-то счетчик и регистры внешнего цикла

просто, push и pop не являются бесплатными, эта память более медленная чем регистры

Google
Remald
01.10.2018
17:12:36
поэтому в хайлевел программировании считается что рекурсивный вызов функции более накладный, чем цикл. За счет стека как раз

а тут я обнаружил, что вложенные циклы без стека тоже не закодить особо

это нормально или я что-то неправильно делаю?

Th0r
01.10.2018
17:13:28
ээ, ты сколько их там вложить собрался, 1000 циклов вложенных чтоли?:

Remald
01.10.2018
17:14:35
три цикла, а основных регистров всего 4 (rax, rbx, rcx, rdx), и они все нужны в каждом цикле

Th0r
01.10.2018
17:14:36
рекурсивные функции накладны при достаточно большой вложенности, там может и весь сегмент стека сожрать, а обход даже 10 мерного массива циклами - это всего 10 уровней вложенности

Remald
01.10.2018
17:15:59
да, но на каждой итерации будет куча push и pop, а это медленнее, чем использование регистров

Th0r
01.10.2018
17:16:11
это нормально или я что-то неправильно делаю?
это нормально. да и не каждый цикл можно оптимизировать так, чтобы было смысл не использовать cx

Remald
01.10.2018
17:17:11
я думал может есть какие-то регистры и быстрая память о которой я не знаю)

впрочем, как я гляжу, дизассемблер программы на Си точно так же юзает стек

Konstantin
01.10.2018
17:17:47
да мало ли тех регистров

Remald
01.10.2018
17:18:28
только почему-то он использует не push и pop, а указатель стека

Google
Remald
01.10.2018
17:18:48
-48(%esp) и тп

Konstantin
01.10.2018
17:19:03
а обязательно использовать именно rax?

Th0r
01.10.2018
17:19:04
Konstantin
01.10.2018
17:19:35
восьмибитные всякие ah и al не помогут?

Remald
01.10.2018
17:19:58
переменные в стек запихнутые
ну их можно доставать через pop, а можно через n(%esp)

Konstantin
01.10.2018
17:20:20
или воспользоваться всякими bp, si, di не по назначению?

Th0r
01.10.2018
17:20:43
ну их можно доставать через pop, а можно через n(%esp)
ага, а потом esp туда сюда прибавлять, да?

Постите смешное!
01.10.2018
17:21:07
какая то уберпрога пишется

Remald
01.10.2018
17:21:55
или воспользоваться всякими bp, si, di не по назначению?
вот да, это я хотел узнать, есть ли еще какие-то регистры, которые можно юзать

при том что они не нужны программе для чего-то другого

как указатель стека и тп

Konstantin
01.10.2018
17:22:53
при том что они не нужны программе для чего-то другого
ну я не знаю, если тебе в циклах не нужны эти регистры, может mov rbp, rax

вместо push rax

Remald
01.10.2018
17:23:43
ок, это по производительности лучше push, только я не знаю, какие регистры можно спокойно перетирать

Konstantin
01.10.2018
17:24:50
а на начало своего кода ты можешь затирать rax, например?

Remald
01.10.2018
17:24:57
там еще есть r8, r9..

Th0r
01.10.2018
17:24:58
как указатель стека и тп
так ты на асме пишешь, ты и должен знать как ты их используешь. но индексные тебе в циклах тебе могут понадобяться, если память тасуешь

Konstantin
01.10.2018
17:25:11
ну он же говорит, что не нужны

хотя тоже странно, может как раз надо их использовать (индексы)?

ты бы кусок кода показал

Google
Konstantin
01.10.2018
17:26:31
там еще есть r8, r9..
там - это где?

вроде ж в x86 таких не было

Remald
01.10.2018
17:26:56
я пишу на AT&T x86_64



сортировка пузырьком, два вложенных цикла

Th0r
01.10.2018
17:27:44
рекурсивные функции становятся опасными когда там данные передающиееся в каждый вызов дохера занимают и вложенности порядка 1к

а тут пузырьковая сортировка с двумя вложенностями

Konstantin
01.10.2018
17:29:10
но пузырек же вроде итеративный?

какая рекурсия?

Remald
01.10.2018
17:29:16
да я же обсуждаю вопрос в общем

Konstantin
01.10.2018
17:29:22
а :)

Remald
01.10.2018
17:29:32
а не как оптимизировать сортировку пузырьком

Th0r
01.10.2018
17:29:48
но пузырек же вроде итеративный?
он до этого сказал > поэтому в хайлевел программировании считается что рекурсивный вызов функции более накладный, чем цикл. За счет стека как раз

Remald
01.10.2018
17:30:38
просто, чем отличается цикл от рекурсии, если все равно по мере вложенности растет стек и много операций со стеком

Konstantin
01.10.2018
17:30:49
я на х86 ассемблере не писал лет пятнадцать, но вроде вот это inc eax странно

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

Th0r
01.10.2018
17:31:31
просто, чем отличается цикл от рекурсии, если все равно по мере вложенности растет стек и много операций со стеком
тем что в цикле ты всегда заранее знаешь сколько стека у тебя будет занято, а рекурсия - зависит от входных данных.

Konstantin
01.10.2018
17:31:36
для этого как раз лучше подойдут si/di

Google
Konstantin
01.10.2018
17:32:25
просто есть всякие там lodsd и stosd

сунул в cx количество элементов и repnz lodsb

ну или как-то так

Remald
01.10.2018
17:33:12
спасибо, почитаю

Th0r
01.10.2018
17:34:52
спасибо, почитаю
еще - вычитать выгоднее (при условии использования cx), потому что есть loopz jcxz

Konstantin
01.10.2018
17:35:47
но вот что-то мне не верится, что получится сделать лучше, чем сделал бы хороший компилятор С

Th0r
01.10.2018
17:36:28
да и с другими регистрами вычитать выгоднее, потому что dec reg установит флаг, от одного сравнения сразу избавляешься

но вот что-то мне не верится, что получится сделать лучше, чем сделал бы хороший компилятор С
получится, но не всегда, а с программами чуть сложнее надо понимать как процессор работает.

Remald
01.10.2018
17:38:33
но вот что-то мне не верится, что получится сделать лучше, чем сделал бы хороший компилятор С
компилятор мне кажется более сложный и запутанный код местами выдает.

subq $32, %rsp movl %edi, -20(%rbp) movq %rsi, -32(%rbp) movl $mas+32, %esi movl $mas+24, %ecx movl $mas+16, %edx movl $mas+8, %eax movq %rsi, %r9 movq %rcx, %r8 movq %rdx, %rcx movq %rax, %rdx movl $mas, %esi movl $.LC0, %edi movl $0, %eax call scanf

код компилятора



мой код

это вызов scanf

мой код еще можно упростить и писать $buffer+n вместо инкремент счетчика

leal buffer(,%eax, 4), $edx экивалентно movl $buffer+n, $edx



вот так можно переписать

тогда мой код явно короче, а компилятор делает по видимому лишнюю работу

Google
Remald
01.10.2018
17:48:40
18 строчку тоже убрать



вот так получше

Maxim
01.10.2018
17:52:36
Бля, я нашел человека, который добровольно пишет на AT&T

Remald
01.10.2018
17:53:06
а чем он принципиально от интел отличается? чуть синтаксис местами странный, да

Maxim
01.10.2018
17:53:15
Ну именно этим и отличается

Maxim
01.10.2018
17:53:42
Он наглухо пизданутый, это да

Remald
01.10.2018
17:53:50
ну я привык, мне норм)

Th0r
01.10.2018
17:53:52
Бля, я нашел человека, который добровольно пишет на AT&T
меня больше интересует что за наркоман написал компилятор :)

Remald
01.10.2018
17:54:06
в асме не так много команд, чтобы их было сложно запомнить

тут сложнее архитектуру знать и уметь писать оптимальный код

а архитектура одинаковая и там и там

Th0r
01.10.2018
17:55:29
в асме не так много команд, чтобы их было сложно запомнить
ага, давай еще сделаем язык похожий на си, только там будет писаться {10, array}, 12 = ("i%") scanf

Maxim
01.10.2018
17:55:38
FORTH называется

Для программистов, у которых аппаратный стек в мозгу

Remald
01.10.2018
17:58:36
ага, давай еще сделаем язык похожий на си, только там будет писаться {10, array}, 12 = ("i%") scanf
это будет сложнее, потому что в С конструкций больше. А к базовым конструкциям AT&T можно за два дня привыкнуть

Remald
01.10.2018
17:59:28
ассемблер вообще самый простой язык. Но кодить на нем сложно, потому что надо хорошо знать архитектуру

Maxim
01.10.2018
17:59:54
Собственно, какой вообще смысл кодить вещи типа вызовов scanf на асме?

Компилятор не сможет сделать быстрый call? Или асмовый вариант scanf быстрее парсит?

Страница 7616 из 7737