Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Categories:

книги: ассемблер

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 не обнуляет, особь статья.
Tags: книги, программирование, прочитал
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 34 comments