Comments 10
Говорят, что самое сложное - это сделать просто. Видимо, есть следующий уровень - просто объяснить. С моей точки зрения - удалось.👏
Пнули АМД зачем-то
16 регистров — это вдвое больше, чем было в x86 (8). Для большинства функций хватает, особенно с учётом XMM/YMM.
Причина ограничения — не спешка, а обратная совместимость. AMD расширяла существующий x86, а не проектировала с нуля. Больше регистров = длиннее кодировка инструкций, ломается плотность кода.
ARM64 и RISC-V имеют 31-32 регистра, но там изначально другая философия (фиксированная длина инструкций).
Да и не спешил АМД никуда. Альтернатива интаниум. Когда Бобик сдох Интел просто скопировала АМД 64
По началу было интересно, но дойдя до особенностей, понял, что тут что-то не так. Вспомнилось как учили в универе Ассемблер, писали лабы и даже чет на экранчик с микрухи выводили. Что-то не совсем понятно, чем Особенности в Go отличаются от обычного поведения ассемблера:
Никто Вам не гарантирует, что флаги сбрасывают, очищать их после своих действий просто правило хорошего тона. Ведь не понятно, а когда вы флаг прочитаете, надо ли оно Вам вообще.
Сохранение состояния Вашей программы -- Ваша забота, это Вам не высокоуровневый язык программирования, функции, классы и т.д. Это как глобальные переменные, они по сути такие и есть. Просто некоторые вы сможете только прочитать.
Тут все просто, выполняя команду меняются состояния регистров, не всегда, но если это происходит в описании команды это описано и всегда известно, что регистр может поменяться. А как известно Флаги -- это биты в определенном регистре...
Складывается впечатление, что никогда не работали с ассемблером.
Исправьте "ничтоже сумняся".
Я когда-то тоже довольно долго возился с асм-простынями, потом посмотрел на godbolt.org, что выдают компиляторы C/C++, и понял, что нет смысла. По соотношению "скорость кода/скорость разработки" гораздо эффективнее подтюнить сишный код, чтобы компилятор выдал около-оптимальный асм, чем пытаться писать идеально вручную. Также код получается компактнее/читабельнее/переносимее, и какого-то ужасного UB в небольших функциях вы скорее всего не наловите.
Рассматривайте это как шейдеры/кернелы CUDA - их же пишут на диалекте Си даже те, кто Си не любит. А куда денешься, нет шейдеров на Го, и шейдерный ассемблер существовал недолго.
Ассемблер для гоферов. Часть 1