Фото

История Ассемблера


Ассемблер (англ. «Assembler») — это низкоуровневый язык программирования, который представляет собой промежуточное звено между машинным кодом и высокоуровневыми языками программирования.

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

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

 

Пример кода на ассемблере. 

 

    Начинают изучение программирования обычно с вывода на экран строки «Hello, world!». В языке программирования Python для этого достаточно одной команды:

                print("Hello, World!")

    Просто, понятно и красиво. Однако, существует язык программирования, в котором для достижения того же результата необходимо написать более обширный кусок кода на ассемблере:

          .MODEL SMALL
          .STACK 100h
          .DATA
          HelloMessage DB 'Hello, World!',13,10,'$'
         .CODE
         START:
         mov ax,@data
         mov ds,ax
         mov ah,9
         mov dx,OFFSET HelloMessage
         int 21h
        mov ah,4ch
        int 21h
        END START

    Несмотря на видимое отличие в сложности между 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) и так далее.

Регистры и ячейки памяти получают символические имена, например:

  • EAXEBXAXAH — имена для регистров;
  • mem1 — имя для ячейки памяти.

Пример команды сложения чисел из регистров AX и BX:

add ax, bx

И вот команда вычитания чисел из регистров AX и BX:

sub ax, bx

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

Некоторые из них:

  • INCLUDE — открыть файл и начать его компиляцию;
  • EXIT — прекратить компиляцию файла;
  • DEF — назначить регистру символическое имя и так далее.

Не думайте, что ассемблер — это просто набор инструкций процессора с удобной записью для программиста. Это полноценный язык программирования, на котором можно реализовать циклы, условные операторы, процедуры и функции.

Вот пример ассемблерного кода, который выводит на экран цифры от 1 до 10:

   section .text global _start _start: mov ecx,10 mov eax, '1'
   label1: mov [num], eax mov eax, 4 mov ebx, 1 push ecx
   mov ecx, num
   mov edx, 1
   int 0x80
   mov eax, [num] sub eax, '0' inc eax add eax, '0' pop ecx loop label1
   mov eax,1
   int 0x80
   section .bss num resb 1
 

Почему для разных семейств процессоров нужен свой ассемблер

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

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

Кому и зачем нужен язык ассемблера?

    Ассемблер, даже по нашему примеру «Hello, World!», показывает, что он не так удобен для разработки, как языки высокого уровня. Большие программы на этом языке уже никто не пишет, но есть области, где он становится незаменимым: 

  1. Разработка встроенных программ для микроконтроллеров. Микроконтроллеры устанавливаются в системах сигнализации, пультах управления, датчиках, бытовой технике, модемах и других устройствах. Микроконтроллеры даже используются в робототехнике и спутниковых навигационных системах. Память у них ограничена, поэтому ассемблер идеально подходит для их программирования, так как каждая его команда транслируется в одну команду в двоичном коде. Это позволяет определить время выполнения программы и объем памяти, необходимый для ее хранения, исходя из исходного текста программы.
  2. Написание драйверов устройств и некоторых компонентов операционных систем, например, ядра или загрузчика. Некоторые любительские операционные системы, такие как MenuetOS и KolibriOS, полностью написаны на ассемблерном коде. Его также можно найти и в программах для игровых приставок и мультимедийных кодеков.
  3. Реверс-инжиниринг — обратная разработка программ. Область используется для понимания работы программ и их алгоритмов в случаях, когда исходный код не доступен по каким-либо причинам. Этим занимаются антивирусные компании, исследующие вирусы и трояны, создатели драйверов и операционных систем, а также просто любопытные люди. Кроме того, компьютерные злоумышленники также активно используют реверс-инжиниринг для взлома программ, поиска уязвимостей, написания вирусов, генерации ключей и прочих противоправных действий.

    Таким образом, если вам интересно разрабатывать новые микропроцессоры или заниматься реверс-инжинирингом, то стоит серьезно изучить язык ассемблера.

 

Востребованность программистов на ассемблере в 2025

    Программисты на ассемблере востребованы, хотя на веб-сайтах по поиску работы, вероятнее всего, вы не найдете вакансий с заголовками «Требуется программист на ассемблере». Зато там много объявлений, которые требуют знание языка в дополнение к языкам высокого уровня, таким как C, C++ или Python. Вакансии могут быть связаны с реверс-инженерингом, компьютерной безопасностью, разработкой драйверов и программ для микроконтроллеров/микропроцессоров, а также системным программированием и другими областями.

    Предлагаемая заработная плата обычно соответствует стандартам сферы информационных технологий и может варьироваться от 80 до 300 тыс. руб. в зависимости от уровня квалификации и опыта кандидата.

 

Стоит ли начинать изучение программирования с языка ассемблера

    Нет, такой подход не рекомендуется. На это есть несколько причин:

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

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

 

Источник: blog.skillfactory.ru

 

 



Фото

MiniDLNA - домашний медиасервер


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

   

    Сервер minidlna можно установить как на устройства под управлением Windows, так и под управлением Linux. Сервер очень нетребователен к ресурсам. 

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

  • минимум двухъядерный процессор с частотой от 1 ГГц;
  • 4 ГБ ОЗУ для стабильной работы.

    Minidlna можно установить например на свой ноутбук или же стационарный компьютер, и потом наслаждаться просмотром  своих файлов на любом устройстве в домашней сети.

    В данной статье мы подробно рассмотрим установку minidlna на Ubuntu Linux.

    DLNA (Digital Living Network Alliance) — набор стандартов, которые позволяют передавать и воспроизводить в реальном времени фото, видео и аудио файлы по домашней сети. Поддерживается проводная (Ethernet) и беспроводная (Wi-Fi) связь.

Как установить и настроить MiniDLNA в Ubuntu

 

 

1. Обновление системы

Для начала обновите систему, чтобы все пакеты были актуальными. Откройте терминал и выполните следующие команды:

    sudo apt update && sudo apt upgrade

Это позволит обновить списки ваших пакетов и установить последние версии установленных пакетов.

2. Установка MiniDLNA

Репозитории Ubuntu по умолчанию включают пакет MiniDLNA, поэтому установить его очень просто. Для установки MiniDLNA используйте следующую команду:

    sudo apt install minidlna

После выполнения этой команды MiniDLNA будет загружена и установлена в вашей системе.

3. Настройка MiniDLNA

Следующий шаг — настроить MiniDLNA для распознавания ваших медиафайлов и их передачи на ваши устройства. 

 Редактирование файла конфигурации

    Файл конфигурации MiniDLNA находится по адресу /etc/minidlna.conf. Вам нужно будет отредактировать этот файл, чтобы указать расположение ваших медиафайлов и настроить другие параметры.

Откройте файл конфигурации с помощью текстового редактора, такого как nano:

    sudo nano /etc/minidlna.conf

Здесь нужно прописать пути к нашим коллекциям и снять комментарии с ряда строк.

# Путь к папке с медиа-файлами
media_dir=A,/mnt/raid_md0/Yandex/Music
media_dir=P,/mnt/raid_md0/Yandex/Foto_and_Video
media_dir=V,/mnt/raid_md0/Kino
# Путь к папке для хранения базы данных и кэша обложек альбомов
db_dir=/var/cache/minidlna
# Путь к папке с лог-файлами
log_dir=/var/log/minidlna
# Имя DLNA-сервера, отображаемое клиентом
friendly_name=My_MiniDLNA
# Автообнаружение новых файлов
inotify=yes

И сохраняем (Ctrl +O).

   В файле конфигурации найдите строки, начинающиеся с media_dir. Вы можете указать различные типы мультимедиа (аудио, видео, изображения), добавив к пути к каталогу префиксы AV, или P.
     Измените значение frendly_name на своё - так будет отображаться имя сервера на клиентах.
Для того, чтобы сервер мог обнаруживать новые файлы параметру inotify необходимо установить значение yes.

4. Запуск и включение MiniDLNA

     После настройки MiniDLNA вам нужно запустить службу и включить её запуск при загрузке.

Запустите службу MiniDLNA с помощью:

    sudo systemctl start minidlna

Чтобы включить автоматический запуск MiniDLNA при загрузке, используйте:

    sudo systemctl enable minidlna

5. Сканирование медиафайлов

    После запуска службы MiniDLNA просканирует ваши медиафайлы и создаст базу данных. Вы можете запустить сканирование вручную, выполнив:

    sudo minidlnad -R

    Эта команда восстанавливает всю базу данных мультимедиа. Процесс может занять несколько минут в зависимости от размера вашей медиатеки.

6. Проверка состояни MiniDLNA

Вы можете проверить состояние службы MiniDLNA, чтобы убедиться, что она работает правильно:

    sudo systemctl status minidlna

Эта команда предоставляет информацию о том, активен ли MiniDLNA и есть ли какие-либо потенциальные проблемы.

 

 

7. Доступ к MiniDLNA с устройств

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

8. Решение некоторых проблем

    - Если сервер не обнаруживается устройствами, то возможно необходимо настроить брандмауер. Вы можете разрешить трафик DLNA, выполнив следующие действия:

    sudo ufw allow 1900/udp && sudo ufw allow 8200/tcp

    - Если папки на minidlna отображаются пустыми, то необходимо проверить права доступа к папкам:

    sudo chown -R minidlna:minidlna /path/to/media

    В Ubuntu рекомендуется папку с медиафайлами minidlna вынести за пределы домашнего каталога пользователя.
Возможности у minidlna проиндексировать файлы в /home/%user% нет. И это правильно. Поэтому и нужно вынести медиатеку из домашнего каталога, например в /home/MediaFiles и дать полные права доступа к этой папке:

    sudo mkdir /home/MediaFiles
sudo chmod -R 777 /home/MediaFiles

    - Возможно есть опечатки в файле конфигурации, необходимо еще раз проверить файл и перезапустить сервер:

    sudo systemctl restart minidlna

    MiniDLNA — это мощный, но простой инструмент для потоковой передачи медиафайлов по вашей сети. Следуя этому руководству, вы установили и настроили MiniDLNA в Ubuntu. Теперь вы можете наслаждаться медиафайлами на любом совместимом устройстве в вашей сети. Благодаря простой настройке и минимальному обслуживанию MiniDLNA — отличный выбор для потоковой передачи домашних медиафайлов.



Фото

Как читать excel-файлы (xlsx) при помощи Python


.xlsx – это расширение документа Excel, который может хранить большой объем данных в табличной форме. Более того, в электронной таблице Excel можно легко выполнять многие виды арифметических и логических вычислений.

 

Иногда программистам требуется прочитать данные из документа Excel. В Python для этого есть множество различных библиотек, например, xlrdopenpyxl и 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 в следующей части этого руководства.
  

Чтение Excel-файла с помощью xlrd

    Библиотека 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('')

Запустим наш код и получим следующий результат.

       

Чтение Excel-файла с помощью openpyxl

    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('')

Запустив наш скрипт, получим следующий вывод.

 

Чтение Excel-файла с помощью pandas

    Если вы не пользовались библиотекой 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. Мы разобрали три различных способа с использованием трех библиотек. Все эти библиотеки имеют разные функции и свойства.

Надеемся, теперь у вас не возникнет сложностей с чтением этих файлов в ваших скриптах.



Фото

Выпуск MaxRadio2 версии 1.2.0


          Состоялся новый релиз MaxRadio2 версии 1.2.0. Это проигрыватель  онлайн радиостанций. Программа работает прямо из трея. Радиостанции разбиты по категориям. Имеется редактор плейлиста, с возможностью добавлять и удалять радиостанции. 

Cкачать MaxRadio2

Что нового в MaxRadio2 версии 1.2.0: 

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

    Программа написана на языке программирования C++, с использованием фреймворка Qt 6.5.3. Имеются версии MaxRadio2 для операционных систем семейства Linux (deb пакет), Windows, а также открытый исходный код программы. Для скачивания имеются только 64 разрядные сборки программы.

Узнать больше и скачать...



Предыдущая     1 2 3 4 5