?

Log in

No account? Create an account
книги: ассемблер - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

книги: ассемблер [сент. 1, 2018|04:21 am]
Anatoly Vorobey
[Tags|, , ]

x86-64 Assembly Language Programming with Ubuntu

Неплохая бесплатная книга для знакомства с современным ассемблером. Применима к любому Линуксу, "Ubuntu" ни при чем. Сознательно опускает многое (например, 16- и 32-битные режимы) и за это автора следует похвалить: лучше меньше, да лучше, особенно для новичков.

Вместе с тем, в книге есть лишнее и недостающее. Некоторые главы сводятся к сухому пересказу списка инструкций (например, плавающей точки), это не нужно. С другой стороны, не хватает краткого описания, что такое машинные коды, с несколькими примерами. Хоть что-то следовало сказать про устройство виртуальной памяти. Некоторые главы сделаны на неправильном "уровне абстракции". Глава про multithreading зачем-то объясняет, как вызывать pthreads, вместо того, чтобы построить пример на системном вызове clone(). Похожим образом глава про аргументы коммандной строки зачем-то использует C-шную конвенцию main(argc,argv) и для этого требует от читателя линковать пример с помощью gcc, а не ld (и не объясняет, почему, чистая магия выходит). Лучше было объяснить, что такое ABI, и брать аргументы по нему.

В целом, адекватное введение в основы 64-битного ассемблера x86-систем для тех, кто знает какой-то язык программирования высшего уровня.

Из обсуждения книги на HN я узнал любопытную деталь. Инструкция NOP (машинный код 0x90) "на самом деле" по своему коду расшифровывается как "xchg eax, eax" (это я знал). Но с переходом к 64 битам пришлось кое-что подправить в консерватории, потому что 32-битные операции вообще говоря обнуляют верхние 32 бита 64-битных регистров, но мы не хотим, конечно, чтобы NOP обнуляла верхнюю половину RAX. В результате 0x90 официально переосмыслили как NOP, не имеющий отношения к XCHG; если очень хочется сделать "xchg eax, eax", можно сделать это через другую форму инструкции, начинающуюся с 0x87 и занимающую два байта. Но например 0x91 остается сокращенной формой "xchg ecx, eax", 0x92 это "xchg edx, eax" итд., и они все обнуляют верхушки 64-битных регистров. А 0x90 не обнуляет, особь статья.
СсылкаОтветить

Comments:
[User Picture]From: livelight
2018-09-04 09:10 am
Ну вот в том-то и дело, что для решения такого рода проблем в ассемблер лезть не надо (разве что для отладки). Вон, добрые люди столь низкоуровневую штуку, как Row Hammer, вообще на JavaScript демонстрировали, так что на Си правильно раскладывать память по кешам тем более возможно.
(Ответить) (Parent) (Thread)
[User Picture]From: archaicos
2018-09-04 10:45 am
Лезть в ассемблер таки надо. За SIMD инструкциями. Чтобы делать одной инструкцией от двух до шестнадцати операций умножения с накоплением. Тут пока на компилятор полагаться не получается.
Т.е. составляющих две: вычислительная (SIMD инструкции) и организационная (разбивка на подзадачи для эффективного использования кэша).
(Ответить) (Parent) (Thread)