vak: (Default)
[personal profile] vak
Если возникло желание разобраться с ассемблером, вовсе необязательно упираться именно в MMIX. Гораздо ближе будет архитектура ARM. А у меня макбук на процессоре Apple M2 и вовсе под рукой. Это тоже RISC процессор с 64-битной архитектурой. Но в отличие от MMIX вполне реальный и массово доступный. Да и всякие Raspberry Pi нынче везде.

Перепишу-ка я тот самый пример hi.S для архитектуры aarch64:
#define Halt    #1
#define Write   #4
#define StdOut  #1

        .text
        .align  2                   // Make sure everything is aligned properly

        .global _start
_start: mov     X0, StdOut          // Print to StdOut
        adr     X1, text            // Put address of text message into register X1
        mov     X2, #23             // Length of our string
        mov     X16, Write          // Unix write() system call
        svc     #0x80               // Call kernel to output the string

        mov     X0, #0              // Exit code
        mov     X16, Halt           // Unix _exit() system call
        svc     #0x80               // Call kernel to terminate the program

text:   .ascii  "Hi, aarch64 assembler!\n"
Компилируем, запускаем:
$ cc hi.S -o hi -e _start
$ ./hi
Hi, aarch64 assembler!
Кучу примеров для мака к книжке по ассемблеру ARM64 можно найти здесь: github.com/below/HelloSilicon

Date: 2023-09-15 06:10 (UTC)
tiresome_cat: (SmilingCat_2)
From: [personal profile] tiresome_cat
Хм. Svc - прямо как в IBM-360. Так и повеяло добрьіми старьіми временами :)

Date: 2023-09-15 08:27 (UTC)
madef: (Default)
From: [personal profile] madef
Программирование на чистом ассемблере сдохло по причине распространения графического оконного интерфейса. Оказалось, что почти всё время уходит на создание, прорисовку и обновление окон, а также на организацию ввода-вывода, а собственно программированием заниматься некогда.

Date: 2023-09-15 19:39 (UTC)
From: [personal profile] ivanrubilo
Сдохло потому что дорого и сложность выросла, а не из-за гуя.

Date: 2023-09-15 19:44 (UTC)
From: [personal profile] dijifi
Мне как-то по долгу службы пришлось в ассемблер PowerPC полезть. Там точно гуй что поймёшь, ISA была сделана для эффективности компиляторов.

Date: 2023-09-15 09:03 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Миленький язычок. (Никогда я на юниксе ассемблер не трогал...)

Date: 2023-09-15 11:47 (UTC)
prool: cat (Default)
From: [personal profile] prool
(сделав пальцы веером)

Я программировал на ассемблере для 8080 и 8086! И для ДВК-2, которая PDP-11. И немного для ЕС ЭВМ (IBM/360) и Электроники Д3-28.

Когда я делал курсовой на 8080, ассемблером был у меня человек. Я как старший программист вначале написал алгоритм на псевдокоде (выдуманном себе языке вроде алгола-60), потом сам начал переводить его на ассемблер 8080. А человек кодировал мои команды в шестнадцатиричные коды и тут же прошивал в ПЗУ, программируемое током. Так мы сделали работающий макет для диплома.

Date: 2023-09-15 19:36 (UTC)
From: [personal profile] ivanrubilo
Можно mov x0, xzr вместо константы, для понижения читаемости :)

Date: 2023-09-15 20:23 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
stdout определена как 1, а в интернетах пишут, что xzr - это 0. Для нуля нельзя разве x0 вычесть из самого себя?

Date: 2023-09-15 23:37 (UTC)
sab123: (Default)
From: [personal profile] sab123
Меня про АРМ давно интересует такой вопрос:

У Интела есть инструкция, которая позволяет прям из юзерспейса остановить процессор и ждать, пока не произойдет доступ по некоему адресу памяти. Есть ли такая на АРМе? Искал, не нашел. Нашел только которая это делает в режиме ядра.

Date: 2023-09-16 00:17 (UTC)
From: [personal profile] ivanrubilo
IIRC нету, но возможно что можно сперва из ядра включить чтобы стало не привилегированное. Точно для PMU счётчики можно, для брякплйнтов надо открывать ArmARM, а я с телефона.

Date: 2023-09-16 19:35 (UTC)
sab123: (Default)
From: [personal profile] sab123
Почему завешивали? Прерываниям она не мешает. Это инструкция для быстрой синхронизации прям в юзерспейсе, чтобы ждать мутекс. Точнее там две инструкции, чтобы избежать гонок - одна задает адрес, читает значение с этого адреса и ставит флаг, что ждем следующей записи по этому аресу, а вторая собственно ждет пока не сбросится этот флаг или не истечет тайм-аут. Это радикально снижает стоимость короткого ожидания - с одной стороны, нет необходимости идти в ядро, с другой стороны нет необходимости жечь энергию непрерывно читая в цикле. Позволяя делать вещи типа https://babkin-cep.blogspot.com/2020/02/scheduling-policy-for-burst.html

Из дополнительных знаний: Фейсбук и Эппл вовсю используют модель программирования, основанную на futures, которая замечательно ложится на такой подход. Гугель использует такое ожидание в реализации сетевых виртуальных дисков для виртуальных машин: на физической машине один процессор отводится под ввод-вывод, и двайвера в виртуальных машинах дают запросы через разделяемую память и мутексы в ней. Собственно, насколько я знаю, Интел добавил эту инструкцию по просьбе Гугля.

Date: 2023-09-17 21:52 (UTC)
From: [personal profile] ivanrubilo
Для синхронизации есть конечно. STREX/LDREX. Адрес помечается в специальном мониторе и потом выдаёт результат и признак если другой поток в этот адрес залезал, так что можно результат отбросить как неконсистентный.
Но это древнегреческий метод.
Сейчас более кузявые на выбор.

Date: 2023-09-17 23:06 (UTC)
sab123: (Default)
From: [personal profile] sab123
Не, это не то. Это без ожидания. А какие более кузявые?

Date: 2023-09-18 07:36 (UTC)
From: [personal profile] ivanrubilo
Было сперва с ожиданием, но потом подумали и разъединили чтение и записать чтобы теоретически можно было что-то в промежутке продолжать исполнять, что не зависит от лока.
Кузявые выглядят как одна комманда, но учитывают ордеринг для данной модели памяти и могут релаксировать в определённых условиях.

Date: 2023-09-18 19:41 (UTC)
sab123: (Default)
From: [personal profile] sab123
Это ж вроде что-то типа compare-and-set? В нем ожидания нет, в нем просто запись производится или нет, в зависимости от того, совпало ли атомарно прочитанное значение.

Date: 2023-09-18 21:27 (UTC)
From: [personal profile] ivanrubilo
Да, ожидание надо делать самому если признак сбросился другим актором.

Date: 2023-09-16 19:59 (UTC)
From: [personal profile] dijifi
Наверное всё-таки не «остановить процессор» а «остановить один thread в юзерспейсе, не отключая прерываний», так что ядро живо, а если программа подвисла — так это её личные проблемы.

Date: 2023-09-16 20:03 (UTC)
sab123: (Default)
From: [personal profile] sab123
Ну естественно. Но в большей части самого процессоре при этом обычно выключается синхронизация, чтоб энергию не ело.

Date: 2023-09-16 23:05 (UTC)
From: [personal profile] dijifi
Внезапно по теме вопроса

Join me at Intro to 64 bit ARM Assembly: From Basic to Party Tricks https://meetu.ps/e/Mf9G2/1t6P/i