?

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:
From: ospf_ripe
2018-09-01 02:52 am
Не рассказать про ABI и передачу аргументов IMHO большое упущение. Например тут это понятно рассказывается: https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/x86-command-line.html (с Linux разница AFAIK небольшая, если есть именно в части параметров а не syscalls).
(Ответить) (Thread)
[User Picture]From: levtsn
2018-09-01 06:15 am
как все запущщено. а он ваще жив?
(Ответить) (Thread)
[User Picture]From: shadow_ru
2018-09-01 06:38 am
Как он может не быть жив?
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-01 01:05 pm
Просто интересно, кому кроме разработчиков железа и компиляторов это может быть важно?

Edited at 2018-09-01 13:06 (UTC)
(Ответить) (Thread)
[User Picture]From: netp_npokon
2018-09-01 01:42 pm
Понимание, во что превращается код на компилируемом языке, нет-нет да и пригождается любому, кто пишет на этом компилируемом языке. Даже на вывод objdump или perf смотреть куда приятнее, когда знаешь ассемблер.
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-01 01:46 pm
Имеется в виду не общее знание того, что такое вообще Ассемблер, а умение работать на конкретном ассемблере со всеми деталями
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: tyomitch
2018-09-01 02:41 pm
Например, отлаживающим крэши своих прог (без символов, на клиентской машине, удалённо)
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: shadow_ru
2018-09-01 04:08 pm
Хакерам, безопасникам.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: archaicos
2018-09-01 10:34 pm
Ну вот, все ломанулись в AI. А там любят матрицы перемножать. Ну и теперь есть 33 библиотеки для этого. Куски кода написаны или на асме, или на интринсиках, что то же самое по сути.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: livelight
2018-09-01 07:28 pm
> Инструкция NOP (машинный код 0x90) "на самом деле" по своему коду расшифровывается как "xchg eax, eax"

Эта инструкция существовала уже в 8086, когда никакого EAX и в помине не было.
Интереснее знать, нахрена они сделали кодом для NOP-а 0x90, а не 0x00, как у нормальных людей.
(Ответить) (Thread)
[User Picture]From: archaicos
2018-09-01 10:29 pm
Вероятно, вначале задизайнили ALU, а потом всё остальное добавили.
(Ответить) (Parent) (Thread)
[User Picture]From: moonofnovember
2018-09-02 03:16 pm
en.wikipedia.org/wiki/NOP#Machine_set_of_directions
- много ли среди них "нормальных" в вашем представлении?
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: difdufzariz
2018-09-02 05:25 am
Вопрос ко всем, кто разбирается в теме.

Когда-то очень давно я проштудировал книгу
Assembly Language for the PC, которую написал John Socha, настоящий создатель программы, которую потом стала известна как Norton Commander.

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

Есть ли удобный симулятор, где можно запускать старый MASM?
(Ответить) (Thread)
From: igoretz
2018-09-04 04:14 pm
Я просмотрел книжку, которую рекомендовал Анатолий — он все верно описал; нет, совершено нет смысла повторять старое, то, что само всплывет в памяти, наверное, и так поможет, а лишние подробности скорее только помешают.
(Ответить) (Parent) (Thread) (Развернуть)
From: sply
2018-09-03 12:10 pm
> pthreads, вместо того, чтобы построить пример на системном вызове clone()

Если потом используются мьютексы, то лучше все в терминах pthreads вести. А clone, это уже особенности реализации.
(Ответить) (Thread)