Разное

Учебник nasm: Хороший учебник по NASM/FASM? — CodeRoad

Содержание

Где фитнес-тренеру брать профессиональную информацию? Часть I. — wellcomclub.ru

В наше время профессионалу оказаться в щекотливой ситуации довольно просто. Достаточно клиенту с апломбом заявить какую-нибудь глупость и вовремя не пошутить, превратив собственную невежественность в смешной курьез — и можно забыть о профессиональной репутации. Клиенты нынче пошли умные и дотошные. Если нарвешься на такого умника — всем расскажет о провале, да еще и в красках. Но этого мало. Некачественная информация бьет не только по репутации, но и по карману. Она не позволяет зарабатывать нужное количество денег. Если  бы еще эта информация не увеличивалась с каждым годом в страшной пропорции. Информационный взрыв — это наша реальность. Рост информации, доступной каждому отдельному человеку, превосходит всякое воображение. И это не субъективное ощущение какого-нибудь работника офиса и/или “активного блогера” — объективные данные говорят о том, что вал информации накатывает со всё возрастающей силой чуть не на каждого жителя Земли… Но без
надежной информации
профессионалом не станешь.  Конечно, самый оптимальный вариант — брать уже переработанную и прокачанную на практике информацию из первоисточника, например, посещая семинары «Велком». По мнению многих, это самые качественное обучение по реабилитационному фитнесу. Существенное преимущество — не нужно знание английского языка и знания проверены практикой преподавателя и собственными ощущениями на семинаре. Специально для тех, кто хочет во всем разбираться сам и  не боится трудностей! Мы целиком поддерживаем ваше желание добраться до сути. Для начала попробуем  указать полезные интернет-ресурсы, которые дадут более глубокие знания по применению фитнес-технологий. Мы постараемся помочь вам стать настоящим профессионалом и найти качественную информацию, которой можно доверять.
Ниже — те ресурсы, которыми пользуемся мы:
Материалы NASM: С 1987 года Национальная академия спортивной медицины была признана мировым лидером в области подготовки и сертификации фитнес-профи. Журнал The Training Edge http://thetrainingedgemagazine.com/past-issues (на английском) Здесь вы можете скачать электронную или PDF копию любого журнала и получить достоверную информацию о новинках спортивной медицины и персонального тренинга от самой авторитетной организации в фитнесе. Блог NASM http://blog.nasm.org/training-benefits/foam-rolling-applying-the-technique-of-self-myofascial-release (на английском) Данная статья — подробнейшим образом разбирает применение миофасциального релиза в персональном тренинге. Масса полезной информации, ответы на ваши вопросы, ссылка на дополнительную литературу. Справа — ссылки на последние статьи и архив статей (про биомеханику движения коленного сустава, про усиление метаболизма, про то, какие упражнения действуют на ягодичные мышцы и не укорачивают фасции и многое другое).
Учебник NASM Essentials of Corrective Exercise Training (на английском) Данное руководство содержит более 100 упражнений направленных на улучшение мобильности суставов, самомассажа, растяжки и других упражнений направленых на корректировку движений. Возможно лучшее руководство на эту тему в картинках. http://www.bookarchive.ru/dok_literatura/zdorove/282536-nasm-essentials-of-corrective-exercise-training.html Видеокурс NASM Essentials of Personal Fitness Training (на английском) Это видео является приложением к одноименному учебнику Сертификации Персональных Тренеров NASM. На основе разработанной специалистами NASM системы OPT ™ вы узнаете основные принципы персонального тренинга, его тонкости и нюансы. 
Курс охватывает концепции в тестировании и разработке программ для развития основных физических качеств и предназначен для обучения и подготовки к сертификационному экзамену NASM. http://rutracker.org/forum/viewtopic.php?t=3711945 Мы продолжим публикацию интересных ресурсов, необходимых фитнес-профессионалу для поддержания необходимого уровня знаний. Следующая статья — о русскоязычных порталах и ресурсах.

SoftCraft: Архитектура ВС. Используемые источники

Информация об архитектуре и Ассемблере процессоров Intel


Начальная страница курса

Общие сведения об архитектуре


  1. Сведения по Ассемблеру с несложными примерами. Есть информация по инструкциям арифметического сопроцессора (FPU)
  2. Методические указания к лабораторным работам (Основы языка ассемблера) 2005 г.
  3. Сайт, посвященый программированию на ассемблере
  4. Вычисление с контролем циклически избыточным кодом (CRC — Cyclical Redundancy Check)

Flat Assembler (FASM)


FASM. Статья в википедии
FASM. Книги
  1. Аблязов Р. 3. Программирование на ассемблере на платформе х86-64. — М.: ДМ К Пресс, 2011. — 304 с
  2. Alexey Lyashko. Mastering Assembly Programming. Packt Publishing, 2017. ISBN 978-1-78728-748-8
FASM. Интернет
  1. Сайт разработчиков FASM (DOS, Windows, Linux, Unix, ARM)
  2. Программирование на FASM для Windows (простые примеры)
  3. «Дневники ча́йника» — примеры программирования на FASM
  4. Пример программы в FASM: вывод на консоль текстового файла в Win32
  5. Flat Assembler — инструмент разработчика (плюсы и и минусы FASM)
  6. Flat Assembler 1.
    64. Мануал программеа
  7. Flat Assembler 1.71. Мануал программера
  8. Понимание FASM
  9. Мануал по flat assembler
  10. Программирование на языке Assembler в FASM (Архив WASM.RU):
  11. Макросы и директивы компилятора FASM — Архив WASM.RU
  12. Руководство по препроцессору FASM
  13. Учебник TAJGA FASM
  14. Компилирование шестнадцатиразрядных программ с помощью fasm
  15. Сравнение MASM и FASM на самом простом примере для начинающих Программистов
  16. Пишем Hello World на FASM
FASM. Каналы на youtube
Канал «Byte++». Уроки, посвященные программированию на fasm под windows
  1. FASM. Установка FASM. Структура программы на ассемблере. Урок 1
  2. FASM. Калькулятор на ассемблере.
    Метки, циклы, условные переходы. Установка FASM
  3. FASM. Данные в FASM. Стек, память, регистры. Биты, байты слова. Урок 2
  4. FASM. add, sub, mul, div, neg. Арифметика ассемблер. Урок 3
  5. FASM. Команды сдвига. ror, rol, shl, shr. Битовый сдвиг. Урок 4
  6. FASM. Логический тип данных. Логические команды or, xor, and, not, test. Урок 5
Канал «Программист». Видео, посвященные программированию на fasm под windows
  1. Природа информации / 1. Информация и числа в компьютере / Программирование с нуля
  2. Бит, байт и т.д. / 2. Информация и числа в компьютере / Программирование с нуля
  3. Как это работает? / 3. Информация и числа в компьютере / Программирование с нуля
  4. К слову… / 4. Информация и числа в компьютере / Программирование с нуля
  5. Предисловие! / 1. Введение в ассемблер / Программирование с нуля
  6. Что такое регистры и прерывания / 2. Введение в ассемблер / Программирование с нуля
  7. Прерывание DOS / 3. Введение в ассемблер — 21h / Программирование с нуля
  8. FASM подробно: Hello, world! / 4. Введение в ассемблер / Программирование с нуля
  9. Стек / 1. Ассемблер и процедуры / Программирование с нуля
  10. Функции / 2. Ассемблер и процедуры / Программирование с нуля
  11. CALL function / 3. Ассемблер и процедуры / Программирование с нуля
  12. Параметры функции (сложно) / 4. Ассемблер и процедуры / Программирование с нуля
  13. Функции «второго уровня» / 5. Ассемблер и процедуры / Программирование с нуля
  14. Вычитание в процессоре / 1. Условные операторы / Программирование с нуля
  15. Если, то… / 2. Условные операторы / Программирование с нуля
Канал «CryptoFun [ IT ]». Видео, посвященные программированию на fasm под linux
  1. // Язык Ассемблера #1 [FASM, Linux, x86-64] //
  2. // Язык Ассемблера #2 [FASM, Linux, x86-64] //
  3. // Язык Ассемблера #3 [FASM, Linux, x86-64] //
  4. // Язык Ассемблера #4 [FASM, Linux, x86-64] //
  5. // Язык Ассемблера #5 [FASM, Linux, x86-64] //
  6. // Язык Ассемблера #6 [FASM, Linux, x86-64] //
  7. // Язык Ассемблера #7 [FASM, Linux, x86-64] //
  8. // Язык Ассемблера #8 [FASM, Linux, x86-64] //
  9. // Язык Ассемблера #9 [FASM, Linux, x86-64] //
  10. // Язык Ассемблера #10 [FASM, Linux, x86-64] //
Канал «CryptoFun [ IT ]». Видео, посвященные реализации алгоритмов (не только на fasm но и на C)
  1. // Алгоритмизация #1 // Интерпретатор обратной польской записи //
  2. // Алгоритмизация #2 // Интерпретатор LISP выражений //
  3. // Алгоритмизация #3 // Рекурсивные функции //
  4. // Алгоритмизация #4 // Длинная арифметика //
  5. // Алгоритмизация #5 // Односвязный список //
  6. // Алгоритмизация #6 // Двоичное дерево //
  7. // Алгоритмизация #7 // Хеш-таблица //
  8. // Алгоритмизация #8 // Виртуальная машина //
Канал «Tomasz Grysztar». Introduction to x86 assembly (Windows)
  1. Introduction to x86 assembly, part 1: MOVing numbers around
  2. Introduction to x86 assembly, part 2: ADDing and SUBtracting, with a few JuMPs
  3. Introduction to x86 assembly, part 3: The stack
  4. Introduction to x86 assembly, part 4: Calling conventions
  5. Introduction to x86 assembly, part 5: CoMParing numbers
  6. Introduction to x86 assembly, part 6: Interpreting binary values, signed and unsigned numbers
  7. Introduction to x86 assembly, part 7: Accessing array with SIB addressing
  8. Introduction to x86 assembly, part 8: Little-endianness and bit operations
  9. Introduction to x86 assembly, part 9: Shifting and rotating
  10. Introduction to x86 assembly, part 10: MULtiplication and DIVision
  11. Introduction to x86 assembly, part 11: 64-bit mode and calling convention
Канал «Tomasz Grysztar». How to use flat assembler (fasm)
  1. How to download and set up flat assembler (fasm)
  2. How to experiment with assembly instructions (fasm and OllyDbg)
  3. How to experiment with 64-bit assembly instructions (fasm and x64dbg)
  4. How to use fasm in DOS
  5. How to set up fasmg on Windows
  6. 8051 example with fasmg
Канал «Philip Bohun». fasm — lessons
  1. Fasm 0 part a — Introduction
  2. Fasm 0 part b — Registers, Memory, and the Control Unit
  3. Fasm 1 — String Length
  4. Fasm 2 — Print Strings and Include Files
  5. Fasm 3 — Read From stdin
Канал «Михаил Ремизов». Пишем трейнер на Ассемблере
  1. [gamehacking] FASM — Учимся работать с горячими клавишами
  2. [gamehacking] Дописываем трейнер — работа с указателями
  3. [gamehacking] Пишем трейнер на ассемблере — часть третья
  4. [gamehacking] Изучаем fasm — часть 1

Netwide Assembler (NASM)


NASM.
Статья в википедии
FASM. Книги
  1. Столяров А.В. Программирование на языке ассемблера NASM для ОС Unix: Уч. пособие, 2-е изд. — М.: МАКС Пресс, 2011. — 188 с.
  2. Jo Van Hoey. Beginning x64 Assembly Programming: From Novice to AVX Professional. — APESS, 2019. — ISBN-13 (pbk): 978-1-4842-5075-4
NASM. Основы программирования + Школа ассемблера
  1. Начинаем программировать на языке ассемблера. Часть 1: Преодолеваем ограничения высокоуровневых языков программирования и разбираемся, как на самом деле работает центральный процессор
  2. Школа ассемблера: условные инструкции, циклы и библиотеки. Часть 2: Начинаем писать полноценные программы и создаем свою собственную библиотеку полезных подпрограмм
  3. Начинаем программировать на языке ассемблера: переход на уровень аппаратного обеспечения. Часть 3: Пришло время попрощаться с операционной системой и использовать собственный код для загрузки компьютера
  4. Школа ассемблера: разработка операционной системы. Часть 4: Располагая навыками, полученными в ходе чтения предыдущих статей серии, вы можете приступить к разработке своей собственной операционной системы
  5. Школа ассемблера: расширение возможностей разработанной операционной системы. Часть 5: Завершаем серию статей, реализуя доступный пользовательским приложениям механизм системных вызовов, такой же, как и в популярных операционных системах
NASM. Журнал “Хакер”. Погружение в ассемблер (MS DOS)
  1. Погружение в ассемблер. Зачем учить ассемблер в 2020 году
  2. Погружение в assembler. Полный курс по программированию на асме от ][
  3. Погружение в ассемблер. Делаем первые шаги в освоении асма
  4. Погружение в ассемблер. Осваиваем арифметические инструкции
  5. Погружение в ассемблер. Как работают переменные, режимы адресации, инструкции условного перехода
  6. Погружение в ассемблер. Учимся работать с памятью
  7. Погружение в ассемблер. Ра­бота­ем с боль­шими чис­лами и дела­ем слож­ные матема­тичес­кие вычис­ления
  8. Погружение в ассемблер. Сок­раща­ем раз­мер прог­раммы
  9. Floppy Bird. Пишем на ассемблере клон игры Flappy Bird, который уместится в бутсектор
  10. МикроБ. Пишем бейсик на ассемблере и умещаем в 512 байт
NASM. Интернет. Разное
  1. Столяров А.В. Программирование: введение в профессию. II: низкоуровневое программирование
  2. Столяров А.В. Программирование на языке ассемблера NASM для ОС Unix
  3. Введение в Ассемблер

Macro Assembler (MASM)


MASM. Статья в википедии
  1. Фрагмент лекций по архитектуре x86 с примерами на masm
  2. Ассемблер для начинающих. Примеры простых программ

Turbo Assembler (TASM)


TASM. Статья в википедии
TASM. Интернет
  1. Лекции по архитектуре x86 с примерами на tasm
  2. Assembler & Win32. Курс молодого бойца

GNU Assembler (GAS)


GAS. Статья в википедии
GAS. Книги
  1. Гагарина Л. Г., Кононова А. И. Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие. — М.: СОЛОН-Пресс, 2019. — 368 с.
GAS. Интернет
  1. Ассемблер в Linux для программистов C
  2. Использование GNU ассемблера as
  3. Написание и отладка кода на ассемблере x86/x64 в Linux
  4. Ассемблеры для Linux: Сравнение GAS и NASM

Начальная страница курса

linux — Разные синтаксисы сборки для одного и того же процессора?

Я решил изучить ассемблер через онлайн-уроки.

Я наткнулся на этот, который использует компилятор NASM, как и большинство других руководств: http://www.tutorialspoint.com/assembly_programming/index.htm

Я также наткнулся на эту серию на YouTube «Учебник по сборке для хакеров» https://www.youtube.com/watch?v=K0g-twy = PLue5IPmkmZ-P1pDbF3vSQtuNquX0SZHpB Здесь используется то, что парень описывает как «общий компилятор Linux» (owtte). Команды для компиляции выглядят примерно так:

as -o file.o file.s

Где file.s — это исходный код сборки. С последующим:

ld -o file file.o

Где файл — это исполняемый файл.

В каждом учебном пособии используется свой синтаксис (например, регистру в последнем учебном пособии всегда предшествует%. NB. Кажется, есть и менее поверхностные различия в синтаксисе, чем этот). Этот синтаксис определяется отдельным компилятором?

Я также сначала был сбит с толку, когда попытался скомпилировать код из учебника NASM с помощью последнего метода. У меня всегда было впечатление, что набор инструкций должен зависеть от процессора, и поэтому не имеет значения, какой компилятор я использую. Я только что пришел к выводу, что это просто различия в синтаксисе, но правильно ли это?

Я, кстати, запускаю компьютер Linux с ядром 4.1.6.

Мой главный вопрос: какой синтаксис я использую? Это просто вопрос выбора? Один используется более широко, чем другой? Спасибо за любую помощь.

0

jezza 25 Сен 2015 в 02:37

2 ответа

Лучший ответ

В каждом учебном пособии используется свой синтаксис (например, регистру в последнем учебном пособии всегда предшествует%. NB. Кажется, есть и менее поверхностные различия в синтаксисе, чем этот). Этот синтаксис определяется отдельным компилятором?

Да, разные ассемблеры (= компиляторы языка ассемблера) могут использовать разный синтаксис языка ассемблера, хотя они предоставляют код для одного и того же процессора и платформы.

Мой главный вопрос: какой синтаксис я использую? Это просто вопрос выбора? Один используется более широко, чем другой?

Один ассемблер, такой как NASM, может использовать широкий спектр процессоров и платформ, в этом случае вам будет полезно изучить его синтаксис, когда вам нужно работать с несколькими процессорами или платформами.

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

И последнее, что не менее важно, вы можете просто предпочесть конкретный ассемблер, потому что вам нравятся его функции или синтаксис.

1

mvw 24 Сен 2015 в 23:47

Если вы работаете в системе Windows, синтаксис Microsoft MASM (ML. EXE или ML64.exe для 64-разрядной версии) практически совпадает с синтаксисом Intel. MASM (ML.EXE и ML64.EXE) включен в бесплатные экспресс-выпуски Visual Studio, хотя обычно вам нужно создать настраиваемый шаг сборки для вызова ассемблера в проекте VS. VS express включает хороший отладчик исходного уровня.

Если вы работаете в системе типов Linux, вы, вероятно, будете использовать синтаксис AT&T, который, как я полагаю, закончился именно так, поскольку это было преобразование некоего универсального ассемблера. Я не знаю, какой ассемблер (ы) рекомендовать для Linux.

0

rcgldr 26 Сен 2015 в 08:06

MASM, TASM, FASM, NASM под Windows и Linux

В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.

MASM

Используется для создания драйверов под Windows.

По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:masm32. Создадим программу prog11.asm, которая ничего не делает.

.586P
.model flat, stdcall 
_data segment 
_data ends
_text segment
start:
ret   
_text ends
end start

Произведём ассемблирование (трансляцию) файла prog11.asm, используя ассемблер с сайта.


Ключ /coff используется здесь для трансляции 32-битных программ. Как сказано в Википедии, «MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.»

Также ассемблер версии 6. можно взять на сайте Кипа Ирвина kipirvine.com/asm, автора книги «Язык ассемблера для процессоров Intel».

Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.

MASM с сайта Microsoft

Далее скачаем MASM (версия 8. 0) с сайта Microsoft по ссылке. Загруженный файл носит название «MASMsetup.exe». При запуске этого файла получаем сообщение -«Microsoft Visual C++ Express Edition 2005 required».

Открываем этот файл архиватором (например 7zip). Внутри видим файл setup.exe, извлекаем его, открываем архиватором. Внутри видим два файла vc_masm.msi,vc_masm1.cab. Извлекаем файл vc_masm1.cab, открываем архиватором. Внутри видим файл FL_ml_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8. Переименовываем его в файл fl_ml.exe, далее, произведём ассемблирование файла prog11.asm, используя ассемблер fl_ml.exe.

MASM в Visual Studio

Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:Program FilesMicrosoft Visual Studio 10.0VCbinml.exe.

Для того, чтобы запустить на 32- или 64-разрядной системе и создавать программы, работающие как под 32-, так и под 64-разрядной Windows, подходит MASM32 (ml.exe, fl_ml.exe). Для того, чтобы работать на 32- и 64-разрядных системах и создавать программы, работающие под 64-разрядной Windows, но неработающие под 32-разрядной нужен ассемблер ml64. exe. Лежит в папке C:Program FilesMicrosoft Visual Studio 10.0VCbinamd64 и вот здесь — C:Program FilesMicrosoft Visual Studio 10.0VCbinx86_amd64.

TASM

Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.

Скачать можно, например, здесь. Инсталлятора нет, просто извлекаем программу. Вот исходник из книги Питера Абеля (рис. 3.2) «Язык Ассемблера для IBM PC и программирования».

stacksg segment para stack 'stack'
    db 12 dup ('stackseg')
stacksg ends
codesg segment para 'code'
begin proc far
 assume ss:stacksg,cs:codesg,ds:nothing
 push ds
 sub ax,ax
 push ax
 mov ax, 0123h
 add ax, 0025h
 mov bx,ax
 add bx,ax
 mov cx,bx
 sub cx,ax
 sub ax,ax
 nop
 ret
begin endp
codesg ends
 end begin

Выполним ассемблирование (трансляцию) файла abel32.asm.

Корректность работы программы можно проверить, произведя линковку (компоновку) объектного файла и запустив полученный файл в отладчике.

Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:

Ключ /coff здесь не используем.

FASM

В статье Криса Касперски [RIP Мыщъх] «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»

Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:fasmfasmw.exe. В папке C:fasmEXAMPLESHELLO есть файл HELLO.asm.

include 'win32ax.inc' 
.code
  start:
 invoke    MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK
    invoke    ExitProcess,0
.end start

Откроем файл HELLO.asm из fasmw.exe. Изменим строку include ‘win32ax.inc’ на строку include ‘c:fasmINCLUDEWIN32AX. INC’. Запускаем из меню Run → Run.

Вот ссылки на ресурсы, посвященные FASM:

→ FASM на Cyberforum’е
→ FASM на asmworld
→ Цикл статей «Ассемблер под Windows для чайников»
→ Сайт на narod’е

FASM в Linux

Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/bin или /usr/local/bin (в разных линуксах по разному). Это нужно, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.

Корректность работы программы можно проверить в отладчике.

Nasm

Nasm успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером Gas.

Nasm в Linux можно установить его с помощью менеджера пакетов программного обеспечения с графическим интерфейсом, команды yum install nasm, apt-get install nasm или любой другой команды, актуальной для вашего дистрибутива. Создадим программу, которая 5 раз выводит сообщение “Hello”. Пример взят из книги Андрея Викторовича Столярова “Программирование на языке ассемблера NASM для ОС UNIX”. Учебник, а также библиотека “stud_io.inc” есть на личном сайте автора.

%include "stud_io.inc"
global _start
section .text
_start: mov eax, 0
again:  PRINT "Hello"
PUTCHAR 10
inc eax
cmp eax, 5
jl again
FINISH

Выполним ассемблирование и линковку и запустим файл hello.asm.

$ nasm -f elf hello.asm
$ ld hello.o -o hello
$ ./hello

NASM для Windows

NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.

Ссылки на ресурсы, посвященные Nasm:

→ Сайт А.В. Столярова
→ Сайт, на котором лежит электронный учебник (в архиве)
→ То же самое

AS

Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.

Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».

Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s

.section .text
   .globl _start
   _start:
      movl  $1, %eax
      movl  $2, %ebx
      int   $0x80

Выполним ассемблирование (трансляцию), линковку и запуск программы:

$ as -o gas.o gas.s
$ ld -o gas gas.o
$ ./gas

Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.

.section .text
   .globl main
   main:
      movl  $1, %eax
      movl  $2, %ebx
      int   $0x80

Выполним ассемблирование (трансляцию), линковку и запуск программы:

$ gcc gas.s -o gas
$ ./gas

Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.

Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.

Автор: demser

Источник

Б И Л Е Т Ассемблер NASM: вычисление выражений во время ассемблирования; критические выражения 2. Система регистров процессора i386

Итоговый экзамен. Оценка % [0, 40) [40, 60) [60, 80) [80, 100]

Итоговый экзамен 5 июня, начало 8-45, длительность 2 часа 30 минут с 8-45 рассадка и раздача вариантов, ауд.: П-5, П-6, П-8а 10 задач: 6 задач Си/Асм, 2 задачи компоновка, 2 задачи архитектура ЭВМ Каждая

Подробнее

Итоговый экзамен. Оценка % [0, 40) [40, 60) [60, 80) [80, 100]

Итоговый экзамен 1 июня, начало 8-45, длительность 2 часа 30 минут с 8-45 рассадка и раздача вариантов, ауд.: П-5, П-6, П-13 10 задач: 5 задач Си/Асм, 2 задачи компоновка, 3 задачи архитектура ЭВМ Каждая

Подробнее

СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ МИНСКИЙ ИНСТИТУТ УПРАВЛЕНИЯ УТВЕРЖДЕНА Советом МИУ 2008 г. протокол СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ Учебная программа для специальности 1 31 03 04 Информатика специализации 1-31 03 04

Подробнее

2. Архитектура процессора

3. Программная модель Перевод: Егоров А.В., 2010 г. Введение 2. Архитектура процессора В этой главе описывается аппаратная структура процессора Nios II, обсуждаются все функциональные узлы архитектуры

Подробнее

6. Цикл выполнения команд ЭВМ

6. Цикл выполнения команд ЭВМ Цикл выполнения команды это Последовательность микроопераций центрального процессора, реализующих конкретную команду Путем перетаскивания пунктов указать правильную последовательность

Подробнее

Цифровые сигнальные процессоры TMS320C674x

Основы программирования цифровых сигнальных процессоров Цифровые сигнальные процессоры TMS320C674x Конспект лекций РГРТУ, 2018 Лекция 2. Архитектура ЦСП операционное ядро По фон-нейману электронно-вычислительная

Подробнее

ФОНД ОЦЕНОЧНЫХ СРЕДСТВ

МИНОБРНАУКИ РОССИИ УТВЕРЖДАЮ Заведующий кафедрой прикладной математики, информатики, физики и методики их преподавания Е.А. Позднова 04.02.2016г. ФОНД ОЦЕНОЧНЫХ СРЕДСТВ ПО УЧЕБНОЙ ДИСЦИПЛИНЕ АРХИТЕКТУРА

Подробнее

Проектирование микропроцессора на ПЛИС

Проектирование микропроцессора на ПЛИС Оглавление Введение… 1 Система команд… 1 Классификация команд… 2 Структура команды… 2 Структура процессора… 3 Функционирование процессора… 7 Типы управления…

Подробнее

УП: КВ9.osf стр. 4

УП: 09.02.03-2013-3-КВ9.osf стр. 4 1. ЦЕЛИ ОСВОЕНИЯ ДИСЦИПЛИНЫ 1.1 1) освоение фундаментальных знаний по разработке математического обеспечения ЭВМ и системного программирования; 1.2 2) выработка навыков

Подробнее

ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ

book-3 11/27/08 1:15 PM Page 1 Основы информационных технологий Ю.В. Новиков П.К. Скоробогатов ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ Учебное пособие 4-е издание, исправленное Интернет-Университет Информационных

Подробнее

2015 МГУ/ВМК/СП. Лекция февраля

Лекция 5 21 февраля Далее Архитектура фон Неймана Архитектура IA-32 Вычисление арифметических выражений Передача управления Организация вызова функций 2 Организация вызова функций Вопросы Передача управления

Подробнее

Распределение памяти

Распределение памяти Распределение памяти — это процесс, в результате которого отдельным элементам исходной программы ставятся в соответствие адрес, размер и атрибуты области памяти, необходимой для размещения

Подробнее

Низкоуровневое программирование

Министерство образования и науки Российской Федерации федеральное государственное бюджетное образовательное учреждение высшего образования «Казанский национальный исследовательский технический университет

Подробнее

Рис Структура модуля памяти.

2.4.2. Функции памяти Память микропроцессорной системы выполняет функцию временного или постоянного хранения данных и команд. Объем памяти определяет допустимую сложность выполняемых системой алгоритмов,

Подробнее

РАБОЧАЯ ПРОГРАММА дисциплины

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ТЮМЕНСКИЙ ГОСУДАРСТВЕННЫЙ НЕФТЕГАЗОВЫЙ УНИВЕРСИТЕТ» ИНСТИТУТ

Подробнее

2015 МГУ/ВМК/СП. Лекция 0x апреля

Лекция 0x17 25 апреля История развития x86 4004 ноябрь 1971. 4-битный микропроцессор. Первый в мире коммерчески доступный однокристальный микропроцессор. 8008 апрель 1972. 8080 апрель 1974. 8-битные процессоры.

Подробнее

СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ

СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ Общиесведенияподисциплине Название Системное программирование Читается для специальностей 5В070300 «Информационные системы», 5В070400 «Вычислительная техника и программное обеспечение»

Подробнее

Архитектура компьютера. Э. Таненбаум

Архитектура компьютера. Э. Таненбаум 5-е изд. — СПб.: Питер, 2007. 844 с. Книга Эндрю Таненбаума, всемирно известного специалиста в области информационных технологий, писателя и преподавателя, выходящая

Подробнее

1. Цели и задачи дисциплины

1.1. Цель дисциплины 1. Цели и задачи дисциплины Дисциплина «Системное программное обеспечение» относится к специальному циклу дисциплин и имеет своей целью привить обучающимся навыки разработки современных

Подробнее

КМ1801ВМ3А, КМ1801ВМ3Б, КМ1801ВМ3В

КМ1801ВМ3А, КМ1801ВМ3Б, КМ1801ВМ3В Микросхема КМ1801ВМ3 16-разрядный однокристальный микропроцессор, включающий операционный блок, блок микропрограммного управления, блок прерываний, диспетчер памяти и

Подробнее

Основы микроэлектроники

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Алтайский государственный педагогический университет» (ФГБОУ

Подробнее

учебный курс В.В. Фаронов

В.В. Фаронов учебный курс Рекомендовано Учебно-методическим центром «Классический учебник» в качестве учебного пособия для студентов высших учебных заведений УДК 681.3.06(095) ББК 32.973я7 Ф24 Фаронов

Подробнее

1. Фон-неймановские принципы

1. Фон-неймановские принципы Наличие каких компонентов компьютера следует из формулы ? Оперативная память Процессор Анализ структуры двоичного кода содержимого ячейки

Подробнее

Основные функции микропроцессора :

Архитектура МП Основные понятия Микропроцессор — это программно-управляемое устройство, предназначенное для обработки цифровой информации и управления процессами этой обработки, выполненной в виде одной

Подробнее

Рис Схема включения процессора.

2.Организация обмена информацией: Функции устройств магистрали 2.4. Функции устройств магистрали Рассмотрим теперь, как взаимодействуют на магистрали основные устройства микропроцессорной системы: процессор,

Подробнее

Практикум (лабораторный). Дополнение 1

Практикум (лабораторный). Дополнение 1 Лабораторная работа 1. Представление информации 3.3.Преобразование дробной части десятичного числа Преобразование дробной части выполняется за счет умножения на основание

Подробнее

Организация компьютера (Hardware)

Организация компьютера (Hardware) Лекция 3 Информатика Гаврилов А.В. НГТУ, кафедра АППМ 1 Содержание Основы компьютерной архитектуры Компьютер фон Неймана Аппарат прерываний Внешние устройства Виртуальная

Подробнее

Программа дисциплины

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное учреждение высшего профессионального образования «Казанский (Приволжский) федеральный университет» Институт

Подробнее

Языки программирования

3. Влияние архитектуры Структура компьютера 1. Данные; 2. Элементарные операции; 3. Управление последовательностью действий; 4. Доступ к данным; 5. Управление памятью; 6. Операционная среда. 2 Данные Хранение:

Подробнее

Лекция 5. Центральный микропроцессор

Лекция 5 Центральный микропроцессор Архитектура ПЛК 2 Под архитектурой микроконтроллера понимают комплекс его аппаратных и программных средств, предоставляемых пользователю. Основные модули ПЛК: центральный

Подробнее

Разработка оконных приложений на FASMе

Работа над данной книгой началась еще в студенческие годы. В то время я хотел освоить ассемблер чтобы понимать как работает компьютер. Я понимал, что есть регистры, стек. Знал назначение отдельных команд, но писать полноценные программы у меня не получалось.

Я купил учебник Юрова, но он мне не сильно помог. Данная книга имела два серьезных недостатка.
1. Ассемблер описывался под MS-DOS. Вопрос программирования под Windows освещался очень плохо. Точнее он не освещался совсем. В книге привели дизассемблерный листинг программы, написанной на C и все. Этого явно было мало.
2. В книге мало полноценных примеров. То есть там приводятся примеры использования команд ассемблера, но полных программ, которые можно скопировать, вставить в ассемблер и получить готовую программу очень мало. Имеющийся там пример у меня так и не заработал (не исключаю, что в этом виноваты мои кривые руки).

Я пробовал разные ассемблеры (MASM, NASM и др.) но безрезультатно. Так продолжалось до тех пор, пока я не наткнулся на FASM. Именно в нем мне удалось собрать свою первую программу на ассемблере.

Но тут выяснилось, что ни одна книга по ассемблеру не описывает синтаксис FASM. Да, к нему есть очень неплохая документация (которую кстати перевели на русский язык) и примеры, но этого недостаточно. Тогда я и приступил к написанию справочника по этому ассемблеру чисто для себя. Хотелось иметь под рукой краткое руководство по объявлению секций, ресурсов, таблицы импорта (экспорта), подпрограмм и других составных частей программы.

По мере работы над ним он перерос из простой шпаргалки в полноценную книгу. И встал вопрос что с ней делать. Я обратился в издательства но везде получил отказ. Оставлять ее только для себя было эгоистично. Вдруг она еще кому пригодится. Ведь вполне вероятно что с теми проблемами, с которыми столкнулся я, сталкиваются и другие. Поэтому я выложил ее на торренты, где она лежит и по сей день. Для удобства читателей выкладываю ее и здесь (тем более, что в последнее время наши власти начали активно бороться с торрентами).

Итак. В данной книге описываются основные вопросы программирования на ассемблере с использованием windows API, а именно: создание оконнных и консольных приложений, создание диалоговых окон; работа с файлами, реестром, динамической памятью; создание динамических библиотек dll и многие другие вопросы.

Каждое описание по возможности дано максимально простым языком, без лишних технических подробностей. А также сопровождено большим количеством примеров.
В качестве ассемблера использовался FASM, поэтому в книге так же приводится описание синтаксиса и основных макрокоманд этого замечательного ассемблера.

Оглавление

Глава 1. Первое знакомство с Flatasmом
Почему ассемблер
Что такое Flatasm
Чем отлаживать
Замечания по работе с Flatasmом
Глава 2. Из чего состоит программа на ассемблере
Спецификаторы выходных файлов
Точка входа
Подключаемые файлы
Секции
Таблица импорта
Скелет программы на ассемблере
Глава 3. Данные
Системы счисления
Биты, байты и слова
Где хранить данные
Регистры процессора
Память
Задание данных в секциях
Директива file
Стек
Команда mov
Более сложные варианты команды mov
Команда обмена
Метки
Указатели
Константы
Глава 4. Целочисленная арифметика
Сложение числе
Знаковые и беззнаковые числа
Вычитание
Перемножение
Деление
Команды увеличения размеров чисел
Глава 5. Команды сдвига и логические команды
Команды сдвига
Логический тип данных
Логические команды
Глава 6. Команды передачи управления
Команда jmp
Регистр флагов и команды условного перехода
Команда cmp
Команды call и ret
Соглашения о вызовах
Команды stdcall и invoke
Глава 7. Реализация конструкции языков высокого уровня
Ветвления
Оператор if()
Оператор if()…else
Оператор switch()…case
Циклы
Команда loop
Оператор for()
Оператор while()
Оператор do…while
Сложные типы данных
Перечисление
Массив
Многомерный массив
Структура
Класс
Процедуры и функции
Общие сведения
Чтение параметров из стека
Пролог и эпилог
Макрокоманда proc
Глава 8. Начинаем программировать
Двойственность функции Windows API
Понятие дескриптора
Функция GetModuleHandle(A/W)
Функция MessageBox(A/W)
Пишем Hello World
Дескриптор окна рабочего стола
Глава 9. Окна и сообщения
Общие сведения
Регистрация класса окна
Создание окна. Стили окна
Цикл обработки сообщений
Оконная процедура
Пример оконного приложения
Функции работы с заголовком окна
Глава 10. Диалоговые окна
Что такое диалоговое окно
Диалоговая процедура
Сообщение WM_COMMAND
Описание шаблона диалогового окна в ресурсах
Создание диалогового окна на основе ресурсов
Создание диалогового окна на основе шаблона в памяти
Немодальные диалоговые окна
Глава 11. Элементы управления
Типы элементов управления
Описание элемента управления в ресурсах
Идентификатор и дескриптор
Функции работы с элементами управления
Статический элемент управления
Кнопка
Поле ввода
Флажок
Рамка группы
Группа переключателей
Список
Комбинированный список
Глава 12. Меню
Описание меню в ресурсах
Ручное создание меню
Присоединение меню к окну
Обработка событий меню
Редактирование меню
Глава 13. Взаимодействие с окнами других приложений
Поиск окон
Функция SetWindowPos
Функция MoveWindow
Функция ShowWindow
Глава 14. Работа с динамической памятью
Функции работы с динамической памятью
Пример программы
Что такое куча
Функции работы с кучей
Пример программы
Глава 15. Работа со строками
Что такое строка на самом деле
Функции работы со строками
Пример программы
Unicode строки
Функции конвертирования
Глава 16. Работа с файлами
Создание и открытие файла
Чтение из файла, запись в файл
Навигация в файле
Операции над файлами
Чтение и изменение атрибутов
Директории
Текущая директория
Окно открытия файла
Окно сохранения файла
Переменные окружения
Глава 17. Реестр
Общие сведения
Открытие и закрытие раздела
Создание и удаление раздела
Чтение и изменение значения ключа
Пример программы
Глава 18. Файлы инициализации
Структура файлов инициализации
Чтение параметров
Запись параметров
Пример программы
Глава 19. Клавиатура и мышь
Мышь
Клавиатура
Глава 20. Разработка динамических библиотек
Таблица экспорта
Статическая и динамическая загрузка
Функция dllmain
Таблица перемещаемых элементов
Пример
Глава 21. Разработка консольных приложений
Объявление консольного приложения
Ручное создание консоли
Заголовок окна консоли
Буфер экрана
Стандартные потоки ввода/вывода
Ввод и вывод на консоль
Пример программы
Глава 22. Обработка ошибок
SEH
Пример программы
Функция SetUnhandledExceptionFilter
VEH
Функции GetLastError и FormatMessage
Глава 23. Ресурсы
Типы ресурсов
Идентификатор языка
Изображение
Иконка
Строка
Ресурсы, загруженные из res файла

 

Почему переход с AT & T на синтаксис Intel делает этот учебник segfault с использованием GAS?

Я изучаю некоторые учебники по http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, чтобы ознакомиться с x86/x64. Этот код учебника компилируется и запускается без икоты с использованием предоставленного кода, который использует синтаксис AT & T:

.global main
.text
main:                               # This is called by C library startup code
    mov     $message, %rdi          # First integer (or pointer) parameter in %edi
    call    puts                    # puts("Hello, World")
    ret                             # Return to C library code
message:
    .asciz "Hello, World"           # asciz puts a 0x00 byte at the end

Однако, когда я конвертирую этот код в синтаксис Intel, я получаю ошибку «Ошибка сегментации».

.intel_syntax noprefix
.global main
.text
main:                               # This is called by C library startup code
    mov     rdi, message            # First integer (or pointer) parameter in %edi
    call    puts                    # puts("Hello, World")
    ret                             # Return to C library code
message:
    .asciz "Hello, World"           # asciz puts a 0x00 byte at the end

Я не знаком с x86, поэтому, возможно, я что-то упустил. Любые идеи?

Ответ 1

В синтаксисе AT & T, mov $message, %rdi, $ означает немедленный, то есть адрес сообщения.

В синтаксисе GAS Intel mov rdi, message означает абсолютную адресацию, что означает сообщение content. Чтобы получить фактический адрес сообщения, вам нужно указать ключевое слово offset: mov rdi, offset message.

Дразнитесь к двум двоичным файлам, которые показывают разницу:

AT & Т:

0000000000000000 <main>:
0:   48 c7 c7 00 00 00 00    mov    $0x0,%rdi

Intel:

0000000000000000 <main>:
0:   48 8b 3c 25 00 00 00    mov    0x0,%rdi
Учебники по языку ассемблера

NASM — asmtutor.com

В этом уроке мы будем использовать sys_close для правильного закрытия активного сокетного соединения в дочернем процессе после отправки нашего ответа. Это освободит некоторые ресурсы, которые можно использовать для приема новых входящих подключений.

sys_close ожидает 1 аргумент — дескриптор файла в EBX. Затем в EAX загружается код операции sys_close, и вызывается ядро, чтобы закрыть сокет и удалить активный дескриптор файла.

Примечание: Запустите программу и используйте команду curl http: // localhost: 9001 в другом терминале или подключитесь к тому же адресу с помощью любого стандартного веб-браузера.

socket.asm
                                ; Разъем
                                ; Скомпилируйте с помощью: nasm -f elf socket.asm
                                ; Связать с (64-битные системы требуют опции elf_i386): ld -m elf_i386 socket.o -o socket
                                ; Запускаем с: ./socket

                                % включают "functions.asm"

                                РАЗДЕЛ .data
                                ; наша строка ответа
                                ответ db 'HTTP / 1.1 200 OK ', 0Dh, 0Ah,' Content-Type: text / html ', 0Dh, 0Ah,' Content-Length: 14 ', 0Dh, 0Ah, 0Dh, 0Ah,' Hello World! ', 0Dh, 0Ah, 0h

                                РАЗДЕЛ .bss
                                буфер resb 255,; переменная для хранения заголовков запросов

                                РАЗДЕЛ. Текст
                                global _start

                                _Начало:

                                    xor eax, eax; инициализировать некоторые регистры
                                    xor ebx, ebx
                                    xor edi, edi
                                    xor esi, esi

                                _разъем:

                                    толкнуть байт 6; создать сокет из урока 29
                                    толкнуть байт 1
                                    толкнуть байт 2
                                    mov ecx, esp
                                    mov ebx, 1
                                    mov eax, 102
                                    int 80h

                                _связывать:

                                    mov edi, eax; привязать розетку из урока 30
                                    нажать dword 0x00000000
                                    нажать слово 0x2923
                                    нажать слово 2
                                    mov ecx, esp
                                    толкнуть байт 16
                                    толкнуть ecx
                                    толкни эди
                                    mov ecx, esp
                                    mov ebx, 2
                                    mov eax, 102
                                    int 80h

                                _Слушать:

                                    толкнуть байт 1; послушайте розетку из урока 31
                                    толкни эди
                                    mov ecx, esp
                                    mov ebx, 4
                                    mov eax, 102
                                    int 80h

                                _принимать:

                                    нажать байт 0; принять розетку из урока 32
                                    толкнуть байт 0
                                    толкни эди
                                    mov ecx, esp
                                    mov ebx, 5
                                    mov eax, 102
                                    int 80h

                                _вилка:

                                    mov esi, eax; вилка розетка из урока 33
                                    mov eax, 2
                                    int 80h

                                    cmp eax, 0
                                    jz _read

                                    jmp _accept

                                _читать:

                                    mov edx, 255; читать розетку из урока 33
                                    mov ecx, буфер
                                    mov ebx, esi
                                    mov eax, 3
                                    int 80h

                                    mov eax, буфер
                                    вызов sprintLF

                                _написать:

                                    mov edx, 78; запись сокета из урока 34
                                    mov ecx, ответ
                                    mov ebx, esi
                                    mov eax, 4
                                    int 80h

                                _Закрыть:

                                    mov ebx, esi; переместить esi в ebx (принятый дескриптор файла сокета)
                                    mov eax, 6; вызвать SYS_CLOSE (код операции ядра 6)
                                    int 80h; вызвать ядро

                                _выход:

                                    вызов выйти; вызовите нашу функцию выхода
                             

~ $ nasm -f elf socket.как м ~ $ ld -m elf_i386 socket.o -o сокет ~ $ ./socket


Новое окно терминала

~ $ curl http: // локальный: 9001 Привет мир!

Примечание: Мы правильно закрыли соединения сокетов и удалили их активные файловые дескрипторы.

Сэмюэл Эванс-Пауэлл

Наверное, самым болезненным, с чем я столкнулся, была эта строчка из Справочник AMD64 ABI (стр. 16):

"Конец области входного аргумента должен быть выровнен по границе 16 (32, если __m256 передается в стек) байтовой границы. Другими словами, значение (% rsp + 8) всегда кратно 16 (32), когда управление передается в точку входа функции.
 

Это означает, что указатель стека (rsp) должен быть кратным 16 (rsp% 16 == 0) перед передачей управления другой функции.

Практически все это означает, что в зависимости от текущего состояния ваш стек вам нужно вычесть определенную сумму из указателя стека (в нашем случае стек растет в сторону меньших адресов памяти), чтобы заполнить стек, поэтому его адрес выровнен по 16 байт. Однако вы должны иметь в виду что инструкция ‘call’ автоматически подтолкнет обратный адрес (8 байт — 64-битный) в стек. Вы также должны не забыть добавить в стек указатель (сжать стек), чтобы он указывал на тот же адрес, что и был перед заполнением.

Простая программа nasm «Hola, mundo», демонстрирующая, что нам нужно делать, — это показано ниже (изменено из руководства NASM):

; -------------------------------------------------- ----------------------------
; Записывает на консоль «Hola, mundo», используя библиотеку C. Работает на Linux или любом другом
; другая система, которая не использует подчеркивания для символов в своей библиотеке C. К
; собрать и запустить:
;
; / usr / local / bin / nasm -f macho64 hola.asm && gcc -arch x86_64 -o hola hola.o && ./hola
; -------------------------------------------------- ----------------------------

  global _main
  extern _puts

  раздел .text
_основной:
  sub rsp, 8; Рамка стека пэдов, необходимая для 64-битной OSX
                                ; - мы знаем, что инструкция 'call' добавит
                                ; 8 байт в стек, поэтому мы заполняем его
                                ; еще 8 байт.

  Леа рди, [сообщение]
  вызов _puts

  добавить rsp, 8; Верните наш старый указатель стека, удалив наш
                                ; предыдущее дополнение

  Ret

  раздел .данные
сообщение:
отн. по умолчанию
  db "Hola, mundo", 0; Обратите внимание, что строки должны заканчиваться 0
                                ; в C
 

Вы можете видеть, что мы вычитаем 8 байтов из указателя стека (rsp), чтобы заполнить стек с 8 дополнительными байтами. Это компенсирует 8 байтов, добавленных в стек. инструкцию ‘call’ перед тем, как она войдет в функцию ‘put’, тем самым гарантируя что наш указатель стека кратен 16 до того, как управление будет передано в функция.

Обратите внимание, что нам не всегда нужно вычитать и добавлять 8 байтов из стека. указатель, это число будет варьироваться в зависимости от текущего состояния вашего стека.Для Например, в следующей программе мы не добавляем байтов к указателю стека, он уже выровнено по 16 байт (изменено из учебника NASM):

; -------------------------------------------------- ---------------------------
; 64-битное приложение Mac OSX, записывающее первые 90 чисел Фибоначчи. К
; собрать и запустить:
;
; / usr / local / bin / nasm -f macho64 fib.asm && gcc -arch x86_64 -o fib fib.o && ./fib
; -------------------------------------------------- ---------------------------

  global _main
  extern _printf

  раздел .текст
_основной:
  push rbx; мы должны сохранить это, так как мы его используем
                                ; (требуется сохранить rbx)

  mov ecx, 90; ecx будет обратный отсчет до 0
  xor rax, rax; rax будет удерживать текущий номер (очистить до 0)
  xor rbx, rbx; rbx будет содержать следующее число (очищено до 0)
  inc rbx; rbx изначально равен 1

Распечатать:
  ; Нам нужно вызвать printf, но мы используем rax, rbx и rcx. printf может
  ; уничтожить rax и rcx, поэтому мы сохраним их перед вызовом и восстановим их
  ; после.толкать rax; звонящий - сохранить регистр
  push rcx; звонящий - сохранить регистр

  ле рди, [формат]; установить 1-й параметр (формат)
  mov rsi, rax; установить 2-й параметр (current_number)
  xor rax, rax; ноль rax перед вызовом printf
                                ; обратите внимание, что rax используется для обозначения числа
                                ; векторных регистров, используемых с переменной arg
                                ; функции (такие как printf)

  ; Стек уже выровнен, потому что мы поместили три 8-байтовых регистра и
  ; инструкция call будет подталкивать адрес возврата (который на 64-битной машине
  ; составляет 8 байтов).Это дает нам всего 32 байта, что означает, что указатель стека равен
  ; уже выровнен по 16 байт.
  вызов _printf; printf (формат, текущее_число)

  pop rcx; восстановить сохраненный регистр вызывающего абонента
  поп-ракс; восстановить регистр, сохраненный вызывающим

  mov rdx, rax; сохранить текущий номер
  mov rax, rbx; следующий номер теперь текущий
  добавить rbx, rdx; получить новый следующий номер (последовательность Фибоначчи)
  dec ecx; обратный отсчет
  jnz print; продолжайте, пока счетчик не достигнет 0

  pop rbx; восстановить rbx перед возвратом
  Ret

формат:
отн. по умолчанию
  db "% 20ld", 10, 0
 

Intel x86 язык ассемблера и микроархитектура — общесетевой ассемблер — NASM

Пример

NASM на сегодняшний день является наиболее портируемым ассемблером для архитектуры x86 — он доступен практически для каждой операционной системы на базе x86 (даже входит в состав MacOS) и доступен как кроссплатформенный ассемблер на других платформах.

В этом ассемблере используется синтаксис Intel, но он отличается от других, потому что он сильно фокусируется на собственном «макроязыке» — это позволяет программисту создавать более сложные выражения, используя более простые определения, позволяя создавать новые «инструкции».

К сожалению, эта мощная функция имеет свою цену: тип данных мешает обобщенным инструкциям, поэтому типизация данных не выполняется.

  ответ: db 'Y'; Символ, введенный пользователем

             cmp response, 'N'; *** Ошибка! Неизвестный размер!
             cmp байтовый ответ, 'N'; Так-то лучше!
             cmp response, ax; Нет ошибок!
  

Однако NASM представил одну особенность, которой не хватало другим: имена символов с ограниченной областью видимости.Когда вы определяете символ в других ассемблерах, это имя доступно во всем остальном коде, но это «использует» это имя, «загрязняя» глобальное пространство имен символами.

Например (с использованием синтаксиса NASM):

  STRUC Точка
X resw 1
Y resw 1
       ENDSTRUC
  

После этого определения X и Y определены навсегда. Чтобы не «израсходовать» имена X и Y , нужно было использовать более определенные имена:

  STRUC Точка
Pt_X resw 1
Pt_Y resw 1
       ENDSTRUC
  

Но NASM предлагает альтернативу.Используя концепцию «локальной переменной», вы можете определить поля структуры, которые потребуют от вас указать содержащую структуру в будущих ссылках:

  STRUC Точка
.X resw 1
.Y resw 1
       ENDSTRUC

Курсор ISTRUC Point
       ENDISTRUC

       mov ax, [Курсор + Point.X]
       mov dx, [Курсор + Точка.Y]
  

К сожалению, поскольку NASM не отслеживает типы, вы не можете использовать более естественный синтаксис:

  mov ax, [Курсор.ИКС]
       mov dx, [Cursor.Y]
  



Базовое, но подробное руководство по сборке (Linux)?

Базовое, но подробное руководство по сборке (Linux)? — Переполнение стека

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено 28к раз

В настоящее время этот вопрос не подходит для нашего формата вопросов и ответов.Мы ожидаем, что ответы будут подтверждены фактами, ссылками или опытом, но этот вопрос, скорее всего, повлечет за собой дебаты, аргументы, опросы или расширенное обсуждение. Если вы считаете, что этот вопрос можно улучшить и, возможно, снова открыть, обратитесь за помощью в справочный центр.

Закрыт 8 лет назад.

Я хочу выучить практический язык ассемблера, только что изучив основные концепции в классе.Можно ли порекомендовать какие-нибудь приличные книги или учебные пособия (nasm и т. Д.)?

задан 7 май ’09 в 23: 472009-05-07 23:47

не слишком-сматрне-слишком-сматр

59922 золотых знака77 серебряных знаков1010 бронзовых знаков

1

PC Assembly Language — мой любимый ресурс по программированию на ассемблере.Он современный, бесплатный и охватывает самые разные темы. Он использует NASM, и примеры доступны для Linux (среди нескольких других систем).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *