Перейти к содержимому

Где писать на ассемблере

  • автор:

Обзор встроенного кода на ассемблере

Встроенный ассемблер позволяет внедрять инструкции языка ассемблера непосредственно в исходные программы С и С++ без дополнительных шагов по сборке и компоновке. Встроенный код на ассемблере встроен в компилятор, поэтому вам не требуется отдельный сборщик для языка ассемблера, такой как Microsoft Macro Assembler (MASM).

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

__asm ключевое слово вызывает встроенный сборщик и может отображаться, где бы ни было заявление C или C++. Он не может отображаться самостоятельно. За ним должна следовать инструкция по сборке, группа инструкций, заключенная в круглые скобки, либо, в крайнем случае, пустая пара круглых скобок. Термин «блок __asm » в этом разделе относится к любой инструкции или группе инструкций, в скобках или без них.

Следующий код — это простой блок __asm , заключенный в фигурные скобки. (Этот код является последовательностью пролога пользовательской функции.)

// asm_overview.cpp // processor: x86 void __declspec(naked) main() < // Naked functions must provide their own prolog. __asm < push ebp mov ebp, esp sub esp, __LOCAL_SIZE >// . and epilog __asm < pop ebp ret >> 

Кроме того, можно поставить __asm перед каждой инструкцией по сборке:

__asm push ebp __asm mov ebp, esp __asm sub esp, __LOCAL_SIZE 

Поскольку ключевое слово __asm является разделителем операторов, можно также помещать инструкции ассемблера на одной строке:

__asm push ebp __asm mov ebp, esp __asm sub esp, __LOCAL_SIZE 

Завершение блока, относящегося только к системам Майкрософт

Архитектура компьютера

  1. Постановка задачи. Написать программу, которая выводит на экран строчку «Привет!».
  2. Разработка алгоритма программы. Алгоритм линейный, разработки не требует.
  3. Формализация (запись) алгоритма
    В текстовом редакторе создаем файл privet.asm и записываем в него следующий код (без номеров строк) :

1 data segment ;описание сегмента данных
2 mes db ‘Привет!$’ ;строка для вывода на экран. ‘$’ — признак конца строки
3 data ends ;конец сегмента данных
4
5 code segment ;начало сегмента кода
6 start: ;метка start — начало нашей программы
7 assume cs:code, ds: data ;директива компилятора
8 mov ax, data ;настройка сегмента данных
9 mov ds, ax
10
11 mov ah, 9 ;функция №9 — вывод строки на экран
12 lea dx, mes ;берём адрес строки
13 int 21h ;вызов прерывания для вывода строки
14
15 mov ax, 4c00h ;функция завершения программы
16 int 21h ;завершаем программу
17 code ends ;конец сегмента кода
18 end start ;конец программы с точкой входа start

Описание программы privet.asm

Строки 1 — 3 программы privet.asm содержат описание сегмента данных. Сегмент данных — область память, в которой будут храниться данные для наших программ.
Строки 5 — 17 — это код программы, её исполняемая часть.
В 8 и 9 строках выполняется настройка сегмента данных программы.
Строки 11 — 13 — вывод строки на экран при помощи функции №9 прерывания 21h (подробнее о функциях и работе с ними на следующей лабораторной работе).
15 и 16 строки — стандартное завершение программы.
После символа ‘;’ пишутся комментарии, они не обрабатываются компилятором.

Переход на новую строку

Для организации перехода на новую строку достаточно вывести на экран символы перевода строки и возврата каретки (CR/LF). Эти символы имеют коды 10 и 13. Если в нашей программе необходимо после вывода строки перейти на новую, то для этого достаточно переписать вторую строку программы:

mes2 db ‘Выводим строку и переходим на новую. ‘, 10 , 13 , ‘$’

Переход на новую строку можно выполнить и до вывода сообщения на экран:

mes3 db 10 , 13 , ‘Выводим с новой строки. $’

Задание для выполнения

Написать программу, которая выводит одно под другим следующие сообщения:
Привет!
Меня зовут компьютер!
До свидания!

Где писать на Assembler-е?

Хочу изучить ассемблер, но не знаю, где или в какой программе на нем писать. Я хочу его изучить для того, чтобы в будущем сделать Свою Операционную Систему. Подскажите, какой ассемблер подойдет: NASM, FASM, ASM и т. д.

И еще: где изучить его и в какой программе писать?

  • Вопрос задан более двух лет назад
  • 833 просмотра

1 комментарий

Простой 1 комментарий

Писать можешь в любом редакторе, но компилировать и запускать лучше пока в dosbox. Изучить можно по книгам. Абель, Калашников, Марек и многие другие. Каких то знаний по c/c++ не требуются, по крайней мере мне они не пригодились, единственный знания, которые могут пригодится это архитектура процессора(советую собрать собственный проц в каком нибудь симуляторе по тиму logisim).

Решения вопроса 1
Saboteur @saboteur_kiev
software engineer

К сожалению, твой вопрос похож на «какой командой ассемблера пакман ест чертика».

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

Для начала, подучи С/С++ до уровня, чтобы ты мог писать простые консольные программки, вроде «открыть файл, записать в него что-то», «открыть файл, прочитать с него что-то».
Затем можешь изучить как загружается операционная система с диска, разобраться с тем что такое BIOS на самом деле (а не думать что bios это то меню, в котором можно выбрать грузиться с диска или флешки), и подумать сможешь ли ты написать собственный загрузчик операционной системы.
Потом можно почитать/полистать хотя бы 1-2 ЛЮБЫЕ книжки по ассемблеру (и не бойся такие простые вопросы задавать гуглу). Рекомендовать тебе самое лучшее нет смысла.

А вопросы следует задавать, когда ты уже знаешь примерно половину ответа. Тогда это будут правильные вопросы.

Ответ написан более двух лет назад
Нравится 4 1 комментарий
ANYJT @ANYJT Автор вопроса
Ответы на вопрос 1
Сергей Горностаев @sergey-gornostaev Куратор тега Assembler
Седой и строгий

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

ОС можно и не на ассемблере написать.

Подскажите советы какой ассемблер подойдет: (NASM , FASM , ASM и тд)

где изучить его

в какой программе писать

В любом текстовом редакторе.
Ответ написан более двух лет назад
Нравится 10 18 комментариев
ANYJT @ANYJT Автор вопроса
Спасибо. Но можно ли написать на C и NASM? Можете скинуть где изучить ассемблер ? И компилятор nasm!
Сергей Горностаев @sergey-gornostaev Куратор тега Assembler
ANYJT, можно. Google по запросу «nasm учебник» выдаёт целую кучу результатов.
ANYJT @ANYJT Автор вопроса
Сергей Горностаев, спасибо , а компилятор где скачать? Чтобы в нем писать кодЫ
Сергей Горностаев @sergey-gornostaev Куратор тега Assembler
ANYJT, с официального сайта, очевидно.
ANYJT @ANYJT Автор вопроса

Хорошо. Но одна проблема я не могу скачать под виндовс. Открываю установщик , устанавливается , запускаю но открывается просто консоль

Сергей Горностаев @sergey-gornostaev Куратор тега Assembler
ANYJT, и? Вы IDE что ли ждёте? Тогда вы не тот язык выбрали.
ANYJT @ANYJT Автор вопроса
Сергей Горностаев, в каком смысле?
ANYJT @ANYJT Автор вопроса
Сергей Горностаев, Если так, то тогда какой язык?
Сергей Горностаев @sergey-gornostaev Куратор тега Assembler

ANYJT, в том смысле, что для ассемблеров IDE не используют, программисты работают с ним в консоли, обычно.

ANYJT @ANYJT Автор вопроса

61bf075c398e1486395799.png

ANYJT @ANYJT Автор вопроса
Сергей Горностаев @sergey-gornostaev Куратор тега Assembler
ANYJT @ANYJT Автор вопроса
Ладно , спасибо.

ANYJT, надо понимать, что ассемблер — это не такой язык, как другие. Это по сути прямые машинные инструкции, записанные текстовыми псевдонимами, и немного синтаксического сахара, чтобы не вычислять пальцем адреса участков памяти. Тут вместо IDE достаточно текстового редактора, можно даже с подсветской синтаксиса.

Сама сборка приложения — это вызов компилятора, а потом линковщика. С nasm я дела не имел, в своё время что-то писал на Turbo Assembler, там для этого использовались команды tasm и tlink. Беглое гугление показывает nasm+ld, вот пример https://cs.lmu.edu/~ray/notes/nasmtutorial/ , но, как и ожидалось, в Windows нужно линковать с помощью link, а не ld из binutils https://habr.com/ru/post/326078/

Тут предлагают Code::Blocks https://www.wikihow.com/Run-NASM-on-Windows Но в целом, как я сказал, IDE
для ассемблера не требуется. Можно использовать любой текстовый редактор (в том числе с возможностью вызова внешних команд, либо запускать сборку отдельным скриптом) или любую IDE общего назначения (типа vscode).

Помимо использования ассемблера для написания всей программы, можно использовать ассемблерные вставки в код на C или линковать написанные на ASM объектные файлы с кодом на других языках.

ANYJT @ANYJT Автор вопроса

shurshur, Спасибо . А можно как то написать oс только на C? Если да то есть какие книги руководства? Или сайты с информацией как это реализовать

freeExec

ANYJT, нельзя написать ОС с вашими знаниями, ведь она соберёт исполняемый файл под текущую ОС, а не под вашу.

ANYJT @ANYJT Автор вопроса

ANYJT, условно говоря нет. Потому что «ось» как бы должна уметь управлять памятью, переключать процессы, общаться с периферией, да и процесс её загрузки из BIOS требует некоторых действий. Так что какое-то хотя бы небольшое количество ассемблерного кода для настоящей операционной системы необходимо. Ядро Linux в целом написано на C, но ассемблерные вставки там есть.

Можно разве что поиграться с какими-то общими принципами. Когда я учился, у нас была учебная задача реализовать файловую систему с некоторыми характеристиками и принципами (каждому студенту свой вариант дали), и там не требовалось писать модуль для ядра — достаточно было продемонстрировать хранение структур файловой системы в файле, работу с ними (создать, удалить, переименовать, работать с каталогами и всё такое). Для этого ассемблер, конечно не нужен.

А так-то да, программа на C представляет из себя исполняемый файл под текущую операционную систему (которую эта система умеет запускать, в том числе выполняя динамическое связывание), в хвост и в гриву использует интерфейсы текущей оси (например, printf в конце концов выполняет системный вызов, исполняемый ядром) и вообще не может без неё работать.

Уроки Ассемблера. Язык Ассемблера

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

Язык Ассемблера — это низкоуровневый язык программирования, используемый для компьютера или другого программируемого устройства, специфичный под конкретную компьютерную архитектуру (в отличие от большинства высокоуровневых языков программирования, которые являются кроссплатформенными). Язык Ассемблера конвертируется в исполняемый машинный код с помощью программ Ассемблера, таких как NASM, MASM и т.д.

Прежде чем приступить к данным урокам, вы должны иметь базовые знания по терминологии программирования, а также базовое понимание любого из языков программирования (например, изучить уроки по C++), которые помогут вам быстрее разобраться с базовыми концепциями программирования на Ассемблере и быстрее прогрессировать.

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

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