
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

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

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

Th0r
01.10.2018
17:20:43

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

Remald
01.10.2018
17:21:55
при том что они не нужны программе для чего-то другого
как указатель стека и тп

Konstantin
01.10.2018
17:22:53
вместо 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
вроде ж в 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

Remald
01.10.2018
17:32:03

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
Ну именно этим и отличается

Th0r
01.10.2018
17:53:29

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

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

Th0r
01.10.2018
17:53:52

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

Th0r
01.10.2018
17:55:29

Maxim
01.10.2018
17:55:38
FORTH называется
Для программистов, у которых аппаратный стек в мозгу

Remald
01.10.2018
17:58:36

Th0r
01.10.2018
17:59:07

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

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