Ассемблер (англ. «Assembler») — это низкоуровневый язык программирования, который представляет собой промежуточное звено между машинным кодом и высокоуровневыми языками программирования.
Он используется для написания программ, которые управляют компьютером или другими устройствами на более низком уровне, непосредственно взаимодействуя с аппаратным обеспечением. Код, написанный на этом языке, обычно сохраняется с помощью расширения ASM.
Программы на ассемблере пишутся в виде набора мнемонических инструкций, каждая из которых соответствует определенной команде процессора. Эти инструкции затем транслируются (ассемблируются) в машинный код — набор двоичных чисел, которые понимает центральный процессор и выполняет соответствующие операции.
Пример кода на ассемблере.
Начинают изучение программирования обычно с вывода на экран строки «Hello, world!». В языке программирования Python для этого достаточно одной команды:
Просто, понятно и красиво. Однако, существует язык программирования, в котором для достижения того же результата необходимо написать более обширный кусок кода на ассемблере:
Несмотря на видимое отличие в сложности между Python и ассемблером, важно понимать, что каждая его команда выполняет всего лишь одну операцию, в то время как одна команда Python вызывает несколько операций процессора при выполнении. Оба языка имеют свои преимущества и применяются в различных сферах программирования.
Для более полного понимания языка ассемблера начнем с основ работы процессора и того, на каком языке можно общаться с ним.
Схематическое изображение уровня языков программирования.
Процессор представляет собой электронное устройство, которое, несмотря на свою маленькую размерность сегодня (раньше процессоры занимали целые залы), не обладает способностью понимать слова или цифры. Его реакция основана исключительно на двух уровнях напряжения: высокий уровень соответствует «1», а низкий уровень — «0». Таким образом, каждая команда процессора представляет собой последовательность нулей и единиц: «1» — это импульс, а «0» — его отсутствие.
Для взаимодействия с процессором используется машинный язык, который состоит из инструкций, записанных в двоичной форме. Каждая инструкция определяет одну простую машинную операцию: арифметические действия над числами, логические операции (побитовые), ввод-вывод и так далее.
Например, в архитектуре Intel 8088 инструкция 0000001111000011B представляет операцию сложения двух чисел, в то время как 0010101111000011B выполняет вычитание.
Программирование на машинном языке является сложной задачей, так как приходится оперировать огромными цепочками нулей и единиц. Написание или проверка такой программы требует большого труда, не говоря уже о понимании чужого кода.
Поэтому был разработан язык ассемблера, в котором операции обозначаются буквами и сокращениями английских слов, отражающих суть команды. Например, команда mov ax, 6 означает: «переместить число 6 в регистр AX».
Ниже приведена таблица с примерами машинного кода, соответствующими инструкциями на ассемблере и их описаниями:
Это произошло в период сороковых годов прошлого века. Ассемблер возник для обеспечения работы первых электронно-ламповых ЭВМ, программы для которых писались на машинном языке. В то время, так как объем памяти у компьютеров был ограничен, команды вводились путем переключения тумблеров и нажатия кнопок. Простейшие вычисления занимали значительное количество времени.
ЭВМ ENIAC на электронных лампах.
Проблема была решена, когда ЭВМ научились хранить программы в памяти. В 1950 году была разработана первая программа-транслятор, которая переводила программы, написанные на понятном человеку языке, в машинный код. Эта программа была названа программой-сборщиком, а язык программирования получил название «ассемблера» (от английского слова «assembler» — сборщик). Впервые этот термин стал использовать английский учёный Морис Уилкс (Maurice Wilkes).
Появление ассемблера значительно облегчило жизнь программистов. Они стали использовать команды, которые состояли из условных обозначений, близких к обычному языку. Кроме того, ассемблер позволил сократить размеры программ — это было особенно важно для компьютеров того времени.
Ассемблер — язык второго поколения, если считать машинный язык первым поколением. Он напрямую взаимодействует с процессором, и каждая его команда представляет собой инструкцию для процессора, а не для операционной или файловой системы. Процесс перевода языка ассемблера в машинный код называется ассемблированием.
Код ассемблера из кодов операций и операндов.
Команды ассемблера состоят из кодов операций и операндов. Операнды представляют собой адреса, из которых процессор берет данные для вычислений и в которые он помещает результат. Эти адреса могут быть ячейками оперативной памяти или регистрами — внутренней памятью процессора. Процессор работает с регистрами гораздо быстрее, чем с оперативной памятью.
Операции в языке ассемблера имеют мнемоническую форму, что делает их удобными для запоминания:
ADD — сложение (от англ. addition);SUB — вычитание (от англ. subtraction);MUL — умножение (от англ. multiplication) и так далее.Регистры и ячейки памяти получают символические имена, например:
EAX, EBX, AX, AH — имена для регистров;mem1 — имя для ячейки памяти.Пример команды сложения чисел из регистров AX и BX:
add ax, bx
И вот команда вычитания чисел из регистров AX и BX:
sub ax, bx
В языке ассемблера также присутствуют директивы — команды управления компилятором, то есть программой-ассемблером.
Некоторые из них:
INCLUDE — открыть файл и начать его компиляцию;EXIT — прекратить компиляцию файла;DEF — назначить регистру символическое имя и так далее.Не думайте, что ассемблер — это просто набор инструкций процессора с удобной записью для программиста. Это полноценный язык программирования, на котором можно реализовать циклы, условные операторы, процедуры и функции.
Вот пример ассемблерного кода, который выводит на экран цифры от 1 до 10:
Основная идея состоит в том, что у каждого процессора существует своя архитектура — набор характеристик, определяющих его конструкцию, принцип работы, регистры, адресацию памяти и используемые команды. Если процессоры имеют одинаковую архитектуру, они считаются принадлежащими к одному семейству.
Поскольку наборы команд для различных архитектур процессоров отличаются друг от друга, программы на языке ассемблера, написанные для одного семейства, не будут работать на процессорах другого семейства. В связи с этим его называют машинно-ориентированным языком.
Ассемблер, даже по нашему примеру «Hello, World!», показывает, что он не так удобен для разработки, как языки высокого уровня. Большие программы на этом языке уже никто не пишет, но есть области, где он становится незаменимым:
Таким образом, если вам интересно разрабатывать новые микропроцессоры или заниматься реверс-инжинирингом, то стоит серьезно изучить язык ассемблера.
Программисты на ассемблере востребованы, хотя на веб-сайтах по поиску работы, вероятнее всего, вы не найдете вакансий с заголовками «Требуется программист на ассемблере». Зато там много объявлений, которые требуют знание языка в дополнение к языкам высокого уровня, таким как C, C++ или Python. Вакансии могут быть связаны с реверс-инженерингом, компьютерной безопасностью, разработкой драйверов и программ для микроконтроллеров/микропроцессоров, а также системным программированием и другими областями.
Предлагаемая заработная плата обычно соответствует стандартам сферы информационных технологий и может варьироваться от 80 до 300 тыс. руб. в зависимости от уровня квалификации и опыта кандидата.
Нет, такой подход не рекомендуется. На это есть несколько причин:
- ассемблер существенно отличается от языков высокого уровня, поэтому переход с него на другой язык может быть сложным и запутанным процессом;- опыт, полученный при изучении ассемблера, не будет особенно полезным при работе с другими языками. При изучении высокоуровневых языков после него, вам придется начинать все с нуля;
- ассемблер — очень детальный язык программирования. Все рутинные действия, которые обрабатываются автоматически трансляторами в других языках, приходится описывать здесь вручную. Это может быстро надоесть и стать утомительным.
Поэтому, даже если ваша профессия связана с ассемблером, рекомендуется начать изучение программирования с языка высокого уровня. После этого изучение ассемблера будет проходить более легко и эффективно.
Источник: blog.skillfactory.ru
.xlsx – это расширение документа Excel, который может хранить большой объем данных в табличной форме. Более того, в электронной таблице Excel можно легко выполнять многие виды арифметических и логических вычислений.
Иногда программистам требуется прочитать данные из документа Excel. В Python для этого есть множество различных библиотек, например, xlrd, openpyxl и pandas. Сегодня мы поговорим о том, как читать excel-файлы (xlsx) при помощи Python, и рассмотрим примеры использования различных библиотек для этих целей.
Для начала
Для проверки примеров этого руководства потребуется какой-нибудь файл Excel с расширением .xlsx, содержащий какие-либо исходные данные. Вы можете использовать любой существующий файл Excel или создать новый. Мы создадим новый файл с именем sales.xlsx со следующими данными:
sales.xlsx
| Sales Date | Sales Person | Amount |
| 12/05/18 | Sila Ahmed | 60000 |
| 06/12/19 | Mir Hossain | 50000 |
| 09/08/20 | Sarmin Jahan | 45000 |
| 07/04/21 | Mahmudul Hasan | 30000 |
Этот файл мы и будем читать с помощью различных библиотек Python в следующей части этого руководства.
Библиотека xlrd не устанавливается вместе с Python по умолчанию, так что ее придется установить. Последняя версия этой библиотеки, к сожалению, не поддерживает Excel-файлы с расширением .xlsx. Поэтому устанавливаем версию 1.2.0. Выполните следующую команду в терминале:
pip install xlrd == 1.2.0
После завершения процесса установки создайте Python-файл, в котором мы будем писать скрипт для чтения файла sales.xlsx с помощью модуля xlrd.
Воспользуемся функцией open_workbook() для открытия файла xlsx для чтения. Этот файл Excel содержит только одну таблицу. Поэтому функция workbook.sheet_by_index() используется в скрипте со значением аргумента 0.
Затем используем вложенный цикл for. С его помощью мы будем перемещаться по ячейкам, перебирая строки и столбцы. Также в скрипте используются две функции range() для определения количества строк и столбцов в таблице.
Для чтения значения отдельной ячейки таблицы на каждой итерации цикла воспользуемся функцией cell_value() . Каждое поле в выводе будет разделено одним пробелом табуляции.
import xlrd
# Open the Workbook
workbook = xlrd.open_workbook("sales.xlsx")
# Open the worksheet
worksheet = workbook.sheet_by_index(0)
# Iterate the rows and columns
for i in range(0, 5):
for j in range(0, 3):
# Print the cell values with tab space
print(worksheet.cell_value(i, j), end='\t')
print('')
Запустим наш код и получим следующий результат.
Openpyxl – это еще одна библиотека Python для чтения файла .xlsx, и она также не идет по умолчанию вместе со стандартным пакетом Python. Чтобы установить этот модуль, выполните в терминале следующую команду:
pip install openpyxl
После завершения процесса установки можно начинать писать код для чтения файла sales.xlsx.
Как и модуль xlrd, модуль openpyxl имеет функцию load_workbook() для открытия excel-файла для чтения. В качестве значения аргумента этой функции используется файл sales.xlsx.
Объект wookbook.active служит для чтения значений свойств max_row и max_column. Эти свойства используются во вложенных циклах for для чтения содержимого файла sales.xlsx.
Функцию range() используем для чтения строк таблицы, а функцию iter_cols() — для чтения столбцов. Каждое поле в выводе будет разделено двумя пробелами табуляции.
import openpyxl
# Define variable to load the wookbook
wookbook = openpyxl.load_workbook("sales.xlsx")
# Define variable to read the active sheet:
worksheet = wookbook.active
# Iterate the loop to read the cell values
for i in range(0, worksheet.max_row):
for col in worksheet.iter_cols(1, worksheet.max_column):
print(col[i].value, end="\t\t")
print('')
Запустив наш скрипт, получим следующий вывод.
Если вы не пользовались библиотекой pandas ранее, вам необходимо ее установить. Как и остальные рассматриваемые библиотеки, она не поставляется вместе с Python. Выполните следующую команду, чтобы установить pandas из терминала.
pip install pandas
После завершения процесса установки создаем файл Python и начинаем писать следующий скрипт для чтения файла sales.xlsx.
В библиотеке pandas есть функция read_excel(), которую можно использовать для чтения .xlsx-файлов. Ею мы и воспользуемся в нашем скрипте для чтения файла sales.xlsx.
Функция DataFrame() используется для чтения содержимого нашего файла и преобразования имеющейся там информации во фрейм данных. После мы сохраняем наш фрейм в переменной с именем data. А дальше выводим то, что лежит в data, в консоль.
import pandas as pd
# Load the xlsx file
excel_data = pd.read_excel('sales.xlsx')
# Read the values of the file in the dataframe
data = pd.DataFrame(excel_data, columns=['Sales Date', 'Sales Person', 'Amount'])
# Print the content
print("The content of the file is:\n", data)
После запуска кода мы получим следующий вывод.
Результат работы этого скрипта отличается от двух предыдущих примеров. В первом столбце печатаются номера строк, начиная с нуля. Значения даты выравниваются по центру. Имена продавцов выровнены по правому краю, а сумма — по левому.
Программистам довольно часто приходится работать с файлами .xlsx. Сегодня мы рассмотрели, как читать excel-файлы при помощи Python. Мы разобрали три различных способа с использованием трех библиотек. Все эти библиотеки имеют разные функции и свойства.
Надеемся, теперь у вас не возникнет сложностей с чтением этих файлов в ваших скриптах.
