помогите новичку FASM syntax

Assembler programming questions
  • scuter wrote:скажите где достать список команд процессора IA-32(с объяснениями)
    http://ftp.kolibrios.org/users/Asper/docs/mydocs.7z Документ "Инструкции IA".
    scuter wrote:в принципе если рассматривать простейшую работу процессора, то всё что ему необходимо это:
    память в которой находится программный код
    память в которой хранятся данные т.е. переменные
    механизм который производит пробор по программному коду
    механизм выполняющий команды (среди них все выше упомянутые и команда перехода по коду "jmp")
    В Колибри используется плоская модель памяти, код и данные программы хранятся вместе (не нужно париться с сегментами). Зачем все эти механизмы тебе нужны, главное, что инструкции выполняются одна за другой, пока не встретится инструкция перехода или вызов функции, всё как и в других языках.
    scuter wrote:и если на всё это дело посмотреть немного другим образом всё действительно просто т.е.
    если писать + 10,12; а не add 10,12;
    если - 30,12; а не sub 30,12;
    если = x,y; а не cmp x,y;
    ..................................
    т.е. заменить непонятные 3-х значные слова на понятные символы (хотябы),
    и становится понятно, почему действие (y=x*10/12) не может быть записано в одну строчку
    и многие другие вещи становятся как то значительно проще
    Какой-то урезанный вариант обратной польской нотации.
  • Вот книжки которые надо читать как в самом начале, так и в процессе.
    1) Юров - http://ftp.kolibrios.org/users/Mario/Assembler_Jurov.7z
    2) Зубков - http://ftp.kolibrios.org/users/Mario/As ... _Zubkov.7z
    и если на всё это дело посмотреть немного другим образом всё действительно просто т.е.
    если писать + 10,12; а не add 10,12;
    если - 30,12; а не sub 30,12;
    если = x,y; а не cmp x,y;
    ..................................
    т.е. заменить непонятные 3-х значные слова на понятные символы (хотябы),
    и становится понятно, почему действие (y=x*10/12) не может быть записано в одну строчку
    и многие другие вещи становятся как то значительно проще
    Все не так просто - в ассемблере у процессора есть мнемоники команд, в принципе это сокращения английских слов. К этому просто надо привыкнуть как и в любом языке программирования есть специфика и нужен багаж знаний некоторый.
    К тому же основные команды процессора рассчитаны на целые числа и никаких дробных частей, без собственно логических вывертов мозгом программиста (я не рассматриваю сейчас FPU и другие расширения команд, которые во-первых отъедают место в памяти, не всегда эффективны и не всегда ускоряют работу программы, а иногда даже и наоборот замедляют).
  • Mario, мне очень сильно понравился Брэдли, сейчас учусь по нему.
    Расписано все хорошо. Нравится.
  • Но во всех указанных книгах -- не ФАСМ, а МАСМ и/или ТАСМ.
  • Увы, это так. Правда я сейчас взялся больше за теоретические основы, вроде систем счисления, устройство процессора, как это у брэдли расписано. Когда дойду до практических вещей, наверное, придется держать под рукой ещё справочник по фасму.
  • SII wrote:Но во всех указанных книгах -- не ФАСМ, а МАСМ и/или ТАСМ.
    А какая собственно разница? Юров так вообще не привязан ни к чему.
    Вообще я начинал с FASM и код TASM замечательно переписывается на него - исходники Кулакова из книги "Дисковая подсистема ПК" я достаточно легко использовал в ядре Колибри в свое время.
    МАСМ недавно ковырял пытаясь приложение Kpack переписать на FASM. Работа правда застопорилась из-за отсутствия линковки в FASM, но ассемблерная часть компилируется вполне себе. Проблем особых именно с переписыванием одного синтаксиса на другой не имеется. Здесь мы наблюдаем привычки человека железно привыкшего к языкам высокого уровня, которые упрощают жизнь, но никак не стимулируют к пониманию всего процесса, который происходит на более низком уровне, приближенном к работе аппаратной части.
  • Mario wrote:
    SII wrote:Но во всех указанных книгах -- не ФАСМ, а МАСМ и/или ТАСМ.
    А какая собственно разница?
    Когда уже освоился с языком, проблем с переходом на другой синтаксис обычно нет (ну, кроме привычки или там борьбы с кривостями конкретного транслятора). Ну а в данном случае человек элементарных вещей ещё не понимает. Примеры программ для МАСМа на ФАСМе просто не пойдут из-за разницы синтаксиса, а самостоятельно преобразовать их к ФАСМовским требованиям он не сможет за отсутствием необходимых знаний.
    Работа правда застопорилась из-за отсутствия линковки в FASM, но ассемблерная часть компилируется вполне себе.
    Разве ФАСМ не умеет создавать объектные файлы (КОФФ, ЭЛФ, ОМФ/ОМФ32 -- не суть важно)?
  • SII wrote:
    Mario wrote: Работа правда застопорилась из-за отсутствия линковки в FASM, но ассемблерная часть компилируется вполне себе.
    Разве ФАСМ не умеет создавать объектные файлы (КОФФ, ЭЛФ, ОМФ/ОМФ32 -- не суть важно)?
    Проблема в том, что подключаемая либа создается на MSVS и имеет формат LIB. Суть проблемы в теме Либы на ЯВУ
  • вот на счёт примеров вы правильподметили,
    MASM c FASM-мом не дружит,
    но вот только хотелось бы узнать
    всё таки по какому алгоритму процессор разбирает програмный год,
    и команды процессора, имеется в виду не код ASM

    Code: Select all

    mov ecx, 128
    а реальный машинный код

    Code: Select all

    8B D8
    мне говорили что, что-то такое есть на официальном сайте компании интел,
    только вот где
  • Это уже разбирается микрокодом самого центрального процессора.
    А вообще есть правила кодирования - так сказать "Principles of operations". Можно погуглить, прямую ссылку не скажу, ибо не знаю - не интересовался.
  • scuter

    Идём сюда и качаем Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2: Instruction Set Reference. Остальное тоже рекомендую.
  • scuter wrote:но вот только хотелось бы узнать
    всё таки по какому алгоритму процессор разбирает програмный год,
    и команды процессора, имеется в виду не код ASM

    Code: Select all

    mov ecx, 128
    а реальный машинный код

    Code: Select all

    8B D8
    мне говорили что, что-то такое есть на официальном сайте компании интел,
    только вот где
    Про подробности работы процессора информацию Вы не найдёте: это коммерческая тайна. Ну а способы разбора могут быть самые разные. Разбираться с этим для архитектуры IA-32 -- дело неблагодарное из-за запутанной и малоэффективной системы кодирования команд (вообще, архитектура в этом плане просто ужасная).

    Ну а способ кодирования (какие последовательности байтов каким командам ассемблера соответствуют) приведён в первой части второго тома интеловского руководства по архитектуре, на него ссылку вроде дали.
  • scuter wrote:всё таки по какому алгоритму процессор разбирает ... реальный машинный код
    Чтобы это понять, вовсе не надо быть носителем каких-то коммерческих тайн или высших знаний.

    Достаточно вспомнить, что процессор - это просто такая электронная схема. Он работает по четко установленному протоколу (не алгоритму!), переключая внутренние электрические сигналы в зависимости от входной комбинации внешних электрических сигналов.

    8B в твоем примере - для процессора это не цифра, это группа из восьми электрических сигналов 10001101 (1=высокий уровень напряжения, 0=низкий). При такой (и только такой) комбинации включается цепь записи данных в один из 16- или 32-разрядных регистров. Номер регистра, разрядность и источник информации задаются вторым байтом команды.
    Входящие в состав процессора схемы декодирования команд (дешифраторы) обеспечивают однозначный разбор второго (и последующих) байтов, определяют регистр-приемник (здесь - ecx) и источник информации (в данном случае информация лежит сразу за опкодом - в 3,4,5 и 6 байтах самой команды).

    Потоки информации внутри процессора переключаются специальными шлюзами (мультиплексорами). Над самой информацией могут совершаться какие-то арифметические или логические действия, для чего служит отдельная крутонавороченная схема ALU.

    Если ты попробуешь представить себе ЦПУ именно с этой стороны - все окажется не таким уж и сложным.

    Да и разница между разными ассемблерами тоже будет выглядеть не очень существенной. Ведь asm-команды, в сущности, это слегка "очеловеченные" процессорные опкоды.
    Как говорил мудрейший Козьма Прутков, "Зри в корень!" (вариант: ls /root ; )
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • ура наконец то я нашёл хоть какое то упоминание реального синтаксиса процессора x86
    вместе с командами ASM http://ref.x86asm.net/geek.html
    вот теперь осталось найти описание команд на русском и примеры их использования.
  • Who is online

    Users browsing this forum: No registered users and 3 guests