Ты решил освоить ассемблер, но не знаешь, с чего начать и какие инструменты для этого нужны? Сейчас расскажу и покажу — на примере программы «Hello, world!». А попутно объясню, что процессор твоего компьютера делает после того, как ты запускаешь программу.
Основы ассемблера
Я буду исходить из того, что ты уже знаком с программированием — знаешь какой-нибудь из языков высокого уровня (С, PHP, Java, JavaScript и тому подобные), тебе доводилось в них работать с шестнадцатеричными числами, плюс ты умеешь пользоваться командной строкой под Windows, Linux или macOS.
Если наборы инструкций у процессоров разные, то на каком учить ассемблер лучше всего?
Знаешь, что такое 8088? Это дедушка всех компьютерных процессоров! Причем живой дедушка. Я бы даже сказал — бессмертный и бессменный. Если с твоего процессора, будь то Ryzen, Core i9 или еще какой-то, отколупать все примочки, налепленные туда под влиянием технологического прогресса, то останется старый добрый 8088.
Учим Python за 1 час! #От Профессионала
SGX-анклавы, MMX, 512-битные SIMD-регистры и другие новшества приходят и уходят. Но дедушка 8088 остается неизменным. Подружись сначала с ним. После этого ты легко разберешься с любой примочкой своего процессора.
Больше того, когда ты начинаешь с начала — то есть сперва выучиваешь классический набор инструкций 8088 и только потом постепенно знакомишься с современными фичами, — ты в какой-то миг начинаешь видеть нестандартные способы применения этих самых фич.
Что и как процессор делает после запуска программы
После того как ты запустил софтину и ОС загрузила ее в оперативную память, процессор нацеливается на первый байт твоей программы. Вычленяет оттуда инструкцию и выполняет ее, а выполнив, переходит к следующей. И так до конца программы.
Некоторые инструкции занимают один байт памяти, другие два, три или больше. Они выглядят как-то так:
C7 06 66 55 AA 77
Вернее, даже так:
90 B0 77 B8 AA 77 C7 06 66 55 AA 77
Хотя погоди! Только машина может понять такое. Поэтому много лет назад программисты придумали более гуманный способ общения с компьютером: создали ассемблер.
Благодаря ассемблеру ты теперь вместо того, чтобы танцевать с бубном вокруг шестнадцатеричных чисел, можешь те же самые инструкции писать в мнемонике:
mov al , 0x77
mov ax , 0x77AA
mov word [ 0x5566 ] , 0x77AA
Согласись, такое читать куда легче. Хотя, с другой стороны, если ты видишь ассемблерный код впервые, такая мнемоника для тебя, скорее всего, тоже непонятна. Но мы сейчас это исправим.
Регистры процессора: зачем они нужны, как ими пользоваться
Что делает инструкция mov ? Присваивает число, которое указано справа, переменной, которая указана слева.
Переменная — это либо один из регистров процессора, либо ячейка в оперативной памяти. С регистрами процессор работает быстрее, чем с памятью, потому что регистры расположены у него внутри. Но регистров у процессора мало, так что в любом случае что-то приходится хранить в памяти.
Как создать программу в блокноте (Часть I)
Когда программируешь на ассемблере, ты сам решаешь, какие переменные хранить в памяти, а какие в регистрах. В языках высокого уровня эту задачу выполняет компилятор.
У процессора 8088 регистры 16-битные, их восемь штук (в скобках указаны типичные способы применения регистра):
- AX — общего назначения (аккумулятор);
- BX — общего назначения (адрес);
- CX — общего назначения (счетчик);
- DX — общего назначения (расширяет AX до 32 бит);
- SI — общего назначения (адрес источника);
- DI — общего назначения (адрес приемника);
- BP — указатель базы (обычно адресует переменные, хранимые на стеке);
- SP — указатель стека.
Несмотря на то что у каждого регистра есть типичный способ применения, ты можешь использовать их как заблагорассудится. Четыре первых регистра — AX , BX , CX и DX — при желании можно использовать не полностью, а половинками по 8 бит (старшая H и младшая L ): AH , BH , CH , DH и AL , BL , CL , DL . Например, если запишешь в AX число 0x77AA ( mov ax , 0x77AA ), то в AH попадет 0x77 , в AL — 0xAA .
С теорией пока закончили. Давай теперь подготовим рабочее место и напишем программу «Hello, world!», чтобы понять, как эта теория работает вживую.
Подготовка рабочего места
- Скачай компилятор NASM с www.nasm.us. Обрати внимание, он работает на всех современных ОС: Windows 10, Linux, macOS. Распакуй NASM в какую-нибудь папку. Чем ближе папка к корню, тем удобней. У меня это c : nasm (я работаю в Windows). Если у тебя Linux или macOS, можешь создать папку nasm в своей домашней директории.
- Тебе надо как-то редактировать исходный код. Ты можешь пользоваться любым текстовым редактором, который тебе по душе: Emacs, Vim, Notepad, Notepad++ — сойдет любой. Лично мне нравится редактор, встроенный в Far Manager, с плагином Colorer.
- Чтобы в современных ОС запускать программы, написанные для 8088, и проверять, как они работают, тебе понадобится DOSBox или VirtualBox.
Написание, компиляция и запуск программы «Hello, world!»
Сейчас ты напишешь свою первую программу на ассемблере. Назови ее как хочешь (например, first . asm ) и скопируй в папку, где установлен nasm .
Если тебе непонятно, что тут написано, — не переживай. Пока просто постарайся привыкнуть к ассемблерному коду, пощупать его пальцами. Чуть ниже я все объясню. Плюс студенческая мудрость гласит: «Тебе что-то непонятно? Перечитай и перепиши несколько раз.
Сначала непонятное станет привычным, а затем привычное — понятным».
Теперь запусти командную строку, в Windows это cmd.exe. Потом зайди в папку nasm и скомпилируй программу, используя вот такую команду:
nasm — f bin first . asm — o first . com
Если ты все сделал правильно, программа должна скомпилироваться без ошибок и в командной строке не появится никаких сообщений. NASM просто создаст файл first . com и завершится.
Чтобы запустить этот файл в современной ОС, открой DOSBox и введи туда вот такие три команды:
mount c c : nasm
Само собой, вместо c : nasm тебе надо написать ту папку, куда ты скопировал компилятор. Если ты все сделал правильно, в консоли появится сообщение «Hello, world!».
Инструкции, директивы
В нашей с тобой программе есть только три вещи: инструкции, директивы и метки.
Инструкции. С инструкциями ты уже знаком (мы их разбирали чуть выше) и знаешь, что они представляют собой мнемонику, которую компилятор переводит в машинный код.
Директивы (в нашей программе их две: org и db ) — это распоряжения, которые ты даешь компилятору. Каждая отдельно взятая директива говорит компилятору, что на этапе ассемблирования нужно сделать такое-то действие. В машинный код директива не переводится, но она влияет на то, каким образом будет сгенерирован машинный код.
Директива org говорит компилятору, что все инструкции, которые последуют дальше, надо размещать не в начале сегмента кода, а отступить от начала столько-то байтов (в нашем случае 0x0100).
Директива db сообщает компилятору, что в коде нужно разместить цепочку байтов. Здесь мы перечисляем через запятую, что туда вставить. Это может быть либо строка (в кавычках), либо символ (в апострофах), либо просто число.
В нашем случае: db «Hello, world» , ‘!’ , 0 .
Обрати внимание, символ восклицательного знака я отрезал от остальной строки только для того, чтобы показать, что в директиве db можно оперировать отдельными символами. А вообще писать лучше так:
db «Hello, world!» , 0
Метки, условные и безусловные переходы
Метки используются для двух целей: задавать имена переменных, которые хранятся в памяти (такая метка в нашей программе только одна: string ), и помечать участки в коде, куда можно прыгать из других мест программы (таких меток в нашей программе три штуки — те, которые начинаются с двух символов собаки).
Что значит «прыгать из других мест программы»? В норме процессор выполняет инструкции последовательно, одну за другой. Но если тебе надо организовать ветвление (условие или цикл), ты можешь задействовать инструкцию перехода. Прыгать можно как вперед от текущей инструкции, так и назад.
У тебя в распоряжении есть одна инструкция безусловного перехода ( jmp ) и штук двадцать инструкций условного перехода.
В нашей программе задействованы две инструкции перехода: je и jmp . Первая выполняет условный переход (Jump if Equal — прыгнуть, если равно), вторая (Jump) — безусловный. С их помощью мы организовали цикл.
Обрати внимание: метки начинаются либо с буквы, либо со знака подчеркивания, либо со знака собаки. Цифры вставлять тоже можно, но только не в начало. В конце метки обязательно ставится двоеточие.
Итак, в нашей программе есть только три вещи: инструкции, директивы и метки. Но там могла бы быть и еще одна важная вещь: комментарии. С ними читать исходный код намного проще.
Как добавлять комментарии? Просто поставь точку с запятой, и все, что напишешь после нее (до конца строки), будет комментарием. Давай добавим комментарии в нашу программу.
Теперь, когда ты разобрался во всех частях программы по отдельности, попробуй вникнуть, как все части служат алгоритму, по которому работает наша программа.
- Поместить в BX адрес строки.
- Поместить в AL очередную букву из строки.
- Если вместо буквы там 0, выходим из программы — переходим на 6-й шаг.
- Выводим букву на экран.
- Повторяем со второго шага.
- Конец.
Обрати внимание, мы не можем использовать AX для хранения адреса, потому что нет таких инструкций, которые бы считывали память, используя AX в качестве регистра-источника.
Взаимодействие с пользователем: получение данных с клавиатуры
От программ, которые не могут взаимодействовать с пользователем, толку мало. Так что смотри, как можно считывать данные с клавиатуры. Сохрани вот этот код как second . asm .
Потом иди в командную строку и скомпилируй его в NASM:
Источник: tech-geek.ru
Что такое программирование и зачем оно нужно.
Довольно распространенный вопрос среди тех, кто только начинает изучать программирование — что это и зачем оно нужно. Попытаюсь ответить на вопрос доступным языком.
Давайте забудем про компьютер и попробуем написать инструкцию для пожилого человека. Пусть это будет инструкция для совершения звонка на номер 555555. Так вот, эта инструкция может выглядеть так:
- возьми телефон
- нажми на клавиатуре телефона цифру 5
- нажми на клавиатуре телефона цифру 5
- нажми на клавиатуре телефона цифру 5
- нажми на клавиатуре телефона цифру 5
- нажми на клавиатуре телефона цифру 5
- нажми на клавиатуре телефона кнопку «Вызов»
Эта простейшая инструкция и есть программа. Только выполнять ее будет не компьютер, а человек.
Инструкцию для человека может написать каждый из нас, так как мы понимаем язык друг друга. Так что программирование — это написание программ (инструкций) для исполнителя. В нашем примере исполнителем был человек. Но исполнителем может быть и компьютер. Ему тоже можно написать программу, которую он будет выполнять.
Только тут не все так просто.
Возникает проблема — компьютер не понимает инструкции, написанные на естественном языке. Компьютер вообще не понимает человеческий язык. Его язык — это электрические сигналы. А как же тогда написать программу для компьютера? Для этого созданы языки программирования.
С помощью них можно писать программы для компьютера на языке, который похож на человеческий. Единственное — в большинстве случаев этот язык английский. Поэтому знание английского языка будет хорошим подспорьем для изучения программирования. Сейчас есть специальные курсы, которые направлены на изучение английского для программистов.
Пример программы на языке Pascal
Языков программирования существует великое множество. Точную цифру назвать не получится, так как постоянно появляются новые языки. Даже в школе возможно изучение нескольких языков программирования — это может быть Basic, Pascal, C++, Python и другие. А задача программиста — изучить язык программирования, чтобы писать программы и управлять компьютером.
Можно сказать, что программист — переводчик с человеческого языка на язык машины. Программирование — сложный процесс.
Итак, мы поняли, что программирование — это процесс создания программ для компьютера. Теперь разберемся зачем оно нужно.
Вы хотите написать реферат по биологии. Скорее всего, писать его вы будете на компьютере в каком-либо текстовом редакторе. А откуда взялся текстовый редактор? Конечно, его написали программисты. Вы будете искать информацию в интернете используя браузер, который тоже написали программисты.
После того, как напишете реферат, вы захотите отдохнуть и поиграть в компьютерную игру, которую опять-таки написали программисты. Вообще, работа на компьютере невозможна без использования программ, которые пишут программисты. А значит, если бы не было программирования — не было бы и программ, а компьютер представлял бы собой кучу дорогого железа, ведь сделать что-то с помощью компьютера без программ невозможно.
Источник: easyinformatics.ru
Руководство по написанию псевдокода для начинающих
Перевод статьи «How to write Pseudocode: A beginner’s guide».
Зачем вообще писать псевдокод?
Первый образец, модель или пробный выпуск продукта, созданный для проверки концепции или с учебными целями это прототип. Благодаря прототипам мы можем учиться писать код и при этом не реализовывать полное решение. Разрабатывая пользовательские интерфейсы для приложений, мы создаем несколько прототипов, прежде чем получим финальный вариант.
То же самое касается и кода. Если вы будете сразу писать настоящий код какого-то сложного функционала, вы можете в результате напрасно потерять много времени. Такое может произойти, например, при использовании неподходящего алгоритма или при непродуманном дизайне программы. Чтобы этого избежать, мы пишем псевдокод.
Что такое псевдокод?
Псевдокод это неформальное высокоуровневое описание компьютерной программы или алгоритма. Чтобы написанная вами программа могла выполняться, псевдокод должен быть преобразован в обычный код, написанный на каком-либо языке программирования.
Есть ли альтернатива написанию псевдокода?
Да, есть и другие варианты. Вы можете пользоваться диаграммами UML, блок-схемами, а также языком ДРАКОН. Все это может быть использовано с теми же целями, но потребует больше ресурсов по сравнению с псевдокодом.
Операторы
Операторы это инструкции, предписывающие компьютеру выполнить определенное действие.
При написании псевдокода мы исходим из того, что все инструкции будут выполняться по порядку, сверху вниз. Но при использовании функций и обработке исключений порядок может меняться.
Математические операторы
Математические операторы — неотъемлемая часть разработки решения. Они позволяют нам производить различные манипуляции с хранимыми значениями. Вот как используются распространенные математические символы:
Присваивание: ← или := Пример: c ← 2πr, c := 2πr Сравнение: =, ≠, , ≤, ≥ Арифметические действия: +, −, ×, /, mod Пол/потолок: ⌊, ⌋, ⌈, ⌉ Пример: a ← ⌊b⌋ + ⌈c⌉ Логические: and, or Сумма, произведение: Σ Π Пример: h ← Σa∈A 1/a
Ключевые слова
Ключевое слово это слово, «зарезервированное» за программой и имеющее специальное значение.
Ключевые слова могут быть командами или параметрами. В каждом языке программирования есть свои ключевые (зарезервированные) слова. Они не могут использоваться в качестве имен для переменных.
В псевдокоде ключевые слова используются, чтобы показать обычный input-output и процедурные операции. Эти слова пишутся исключительно в верхнем регистре.
START: это начало вашего псевдокода. INPUT: это данные, полученные от пользователя (путем ввода на клавиатуре или через устройство ввода). READ / GET: это input, используемый при чтении данных из файла. PRINT, DISPLAY, SHOW: Вывод вашего output на экран или соответствующее устройство вывода. COMPUTE, CALCULATE, DETERMINE: Эти слова используются для вычисления результата выражения.
SET, INIT: используются для инициализации значений. INCREMENT, BUMP: используются для увеличения значения переменной. DECREMENT: используется для уменьшения значения переменной.
Условия
При разработке алгоритмов нам нужно оценивать выражения и делать так, чтобы инструкции выполнялись в зависимости от того, является ли значение выражения истиной или ложью (True или False).
Вот некоторые распространенные условия, используемые в псевдокоде:
IF — ELSE IF — ELSE
При помощи этих слов указывается, что инструкции должны быть выполнены при соблюдении определенных условий. (Сами слова в буквальном переводе означают IF — «если», ELSE IF — «еще если», ELSE — «в противном случае», THEN — «тогда, в таком случае», — прим. перев.). Условий при этом может быть несколько, как и переменных.
Вот if-блок с одним условием:
IF вы счастливы THEN улыбайтесь ENDIF
Вот if-блок с разделом else. ELSE позволяет запустить выполнение каких-то инструкций, если первое условие, заданное при помощи IF, не соблюдено.
IF вы счастливы THEN улыбайтесь ELSE хмурьтесь ENDIF