Пример кода на ассемблере - IT Справочник
Llscompany.ru

IT Справочник
9 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

Примеры на Ассемблере для микроконтроллеров Atmel AVR

Здесь представлены примеры различных программ на языке Ассемблера для микроконтроллеров Atmel AVR. Примеры выложены в виде проектов для AVR Studio под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. При обнаружении ошибок просьба сообщить на почту.

Краткое описание команд Ассемблера AVR представлено здесь.

Подробное описание каждой команды представлено в AVR 8bit Instruction Set.

Для более глубокого изучения ассемблера AVR советую к прочтению книгу Юрия Ревича «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» . С беcплатным фрагментом книги можно ознакомиться здесь. Также можно изучить различные методические пособия ВУЗов, например, вот.

Start – Заготовка стартовой инициализации микроконтроллера, в которую входят инициализация стека, очистка ОЗУ (SRAM) и регистров общего назначения (R0 — R31), а также глобальный запрет прерываний. Пример кода приведён ниже. При использовании следует помнить, что регистры ввода-вывода (порты, периферия и т.д.) не очищаются, поэтому их НЕОБХОДИМО инициализировать отдельно.

Delays – Библиотека с подпрограммами задержки. Все задержки рассчитаны на тактовую частоту МК 8 МГц. Библиотека включает следующие процедуры:

  • Delay1us – Задержка повышенной точности в 1 мкс c учетом длительности RCALL и RET.
  • Delay5us – Задержка повышенной точности в 5 мкс c учетом длительности RCALL и RET.
  • Delay10us – Задержка повышенной точности в 10 мкс c учетом длительности RCALL и RET.
  • Delayus – Задержка высокой точности в несколько десятков микросекунд.
  • Delayms – Задержка высокой точности в несколько миллисекунд.

Math – Библиотека с подпрограммами математических операций, включает следующие процедуры:

  • SUB16X16 – Вычитание 16-разрядных чисел.
  • ADD16X16 – Сложение 16-разрядных чисел.
  • MUL16X16s – Знаковое умножение 16-разрядных чисел.
  • MUL16X16u – Беззнаковое умножение 16-разрядных чисел.
  • DIV16X16s – Знаковое деление 16-разрядных чисел.
  • DIV16X16u – Беззнаковое деление 16-разрядных чисел.
  • DIV16POWER2s – Знаковое деление 16-разрядного числа на степень 2.
  • DIV16POWER2u – Беззнаковое деление 16-разрядного числа на степень 2.
  • SIGN16 – Смена знака 16-разрядного числа.
  • DEC2BCD – Перевол 8-разрядного десятичного числа в двоично-десятичное (BCD).
  • BCD2DEC – Перевол 8-разрядного двоично-десятичного (BCD) числа в десятичное.
  • CP16X16 – Сравнение 16-разрядных чисел.
  • DIGITS8 – Вычисление цифр 8-разрядного числа.
  • DIGITS16 – Вычисление цифр 16-разрядного числа.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту А подключены 8 светодиодов (линии 0-7). К линии 0 порта С подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта А, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Clock – В данном примере рассматривается реализация простых часов с 7-сегментым индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка PD2 используется для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментый индикатор. Вывод DQ датчика поключен к линии PC7. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждую секунду. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 0-3 порта С – кнопки. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) подключены к линиям 2-5 порта C. Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 4 и 5 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD6 подключен вывод Trigger датчика, а к линии PD7 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. По таймеру микроконтроллер раз в секунду опрашивает датчик и определяет расстояние до препятсвия в миллиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

Читать еще:  Delphi таблица символов

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

Благин Константин

Программирование как созидательный процесс.

Примеры программирования на Ассемблере

Простой пример обработки сообщения от мыши.
Для обработки сообщения от мыши в DOS`е нам потребуется прерывание 33h.

Вход: ax =0000h
Выход: ax =0000h, если мышь или драйвер мыши не установлены.
ax =0ffffh, драйвер и мышь установлены.
Bx=число кнопок:
0002 или 0ffffh – две
0003 – три
0000 – другое количество

int 33h
Вход: ax=0001h

int 33h
Вход: ax=0002h

Установить обработчик событий:

int 33h
Вход: ax=000сh
es:dx = адрес обработчика
cx = условие вызова
бит 0: любое перемещение
бит 1: нажатие левой копки
бит 2: отпускание левой копки
бит 3: нажатие правой копки
бит 4: отпускание правой копки
бит 5: нажатие средней копки
бит 6: отпускание средней копки
cx = 0000h – отменить обработчик

Обработчик оформляется как дальняя процедура, на входе ax — содержит условие вызова, bx – состояние кнопок, cx и dx – x и y координаты курсора, si и di – счетчик последнего перемещения по горизонтали и вертикали, ds – сегмент данных драйвера мыши.

Делать будем com программу, используя TASM, параметры транслятора и компоновщика такие:

bintasm mouse.asm
bintlink /t /x mouse.obj

/t – создать файл типа .com

/x – не создавать файл карты(map)

.model tiny ; код, данные и стек размещаются в одном сегменте, размером 64 кб
.code ; основной сегмент кода
org 100h ; счетчик для com
start:
mov ax,12h ;установка видеорежима 640х480, 16 цветов
int 10h
mov ax,0000h ;инициализация мыши
int 33h
mov ax,0ch ; установка обработчика мыши
mov cx,0001h ; любое перемещение
lea dx,handler_I ; смещение обработчика
int 33h
;——————————————
mov ah,10h ; ждем нажатие любой кнопки
int 16h
mov ax,000ch
mov cx,0000h ; отменяем обработчик
int 33h
ret ; конец программы
handler_I: ; наш обработчик

; cx и dx – x и y координаты курсора, а для int 10h это номера строки и столбца
push cs
pop ds ; в ds сегмент кода и данные программы
mov bh,0 ; номер видеостраницы
mov ah,0ch ; вывести точку на экран
mov al,color_m ; цвет точки
int 10h
retf ; выход из процедуры
color_m db 0000010

Здесь необходимо заметить, что в режиме 12h возвращаемые координаты совпадают с координатами пикселов. Если использовать режим 13h, то необходимо координату X разделить на 2. Программу можно оптимизировать, необходимо в обработчике мыши использовать прямую запись в видеопамять вместо прерывания 10h.

Массивы на Ассемблере

Создание одномерного массива на Ассемблере.

.model tiny
.code
org 100h
start:
push cs
pop ds
;—————————————
mov cx,99 ;Значение счетчика циклов для команды loop
mov si,0 ;Индекс первого элемента, si так же будет и значением
ARR_loop:
mov array[si],si;array[0]=0,array[1]=1. array[n]=n
inc si
loop ARR_loop ;цикл
int 20h
;—————————————
array dw 99 dup (?) ;Не инициализированный массив
end start

Создание двухмерного массива на Ассемблере.

.model tiny
.code
org 100h
start:
push cs
pop ds ;в сегмент данных заносим сегмент кода
mov si,0 ;Начальная строка
mov bx,0 ;Начальный столбец
;—————————————
array_loop:
mov array[bx][si],bx ;Заполняем элементы массива текущим индексом столбца
inc si ;На следующий элемент строки
cmp si,10 ;Конец строки?
jz NextLine ;если да, переходим на метку NextLine
jmp array_loop ;иначе, продолжаем заполнять строку
NextLine:
mov si,0 ;Обнуляем индекс элемента строки
inc bx ;Переходим на следующий столбец
cmp bx,10 ;Последний столбец?
jz exit ;если да,выход
jmp array_loop ;иначе, продолжаем заполнять следующею строку
exit:
;—————————————
int 20h ;Выход из com программы
;—————————————
array dw 10 dup (10 dup (?))
end start

Поиск числа в двухмерном массиве на Ассемблере.

.model tiny
.code
org 100h
start:
push cs
pop ds ;в сегмент данных заносим сегмент кода
mov si,0
mov bx,0
;Поиск———————————-
array_find:
mov ax,array[bx][si]
call Proverka
inc si ;На следующий элемент строки
cmp si,2 ;Конец строки?
jz NLine ;если да, переходим на метку NextLine
jmp array_find ;иначе, продолжаем заполнять строку
NLine:
mov si,0 ;Обнуляем индекс элемента строки
inc bx ;Переходим на следующий столбец
cmp bx,3 ;Последний столбец?
jz exit ;если да,выход
jmp array_find ;иначе, продолжаем заполнять следующею строку
exit:
;—————————————
int 20h ;Выход из com программы
;—————————————
array dw 2 dup (3 dup (0))
message db «Yes «,0dh,0ah,’$’
;—————————————
Proverka proc
cmp ax,0
jz YES
ret
YES: mov ah,9
mov dx,offset message
int 21h
ret
Proverka endp
end start

Пример расчета факториала на Ассемблере.
Пример расчета факториала, на мой взгляд, очень полезная программа для понимания работы стека.

.model small
.486
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov res,1
push 5
call factorial
;——————————————————
mov ax,4c00h
int 21h
;——————————————————
factorial proc
push bp
mov bp,sp
mov cx,[bp+4]
mov ax,cx
mul res
mov res,ax
dec cx
jcxz end_p
push cx
call factorial
end_p:
mov sp,bp
pop bp
ret
factorial endp
;——————————————————
.data
res dw 0
end start

Прямая запись в видео память на ассемблере.
Рисование горизонтальной линии, с помощью прямой записи в видео память.

.model tiny
.code
org 100h
start:

mov al,13h
int 10h
mov ax,0A000h
mov es,ax
mov dx,320*100+160 ;320*y1+x1(начальная точка)
mov cx,13 ;Длина линии
call gline
mov ah,10h
int 16h

Вывод ASCII кодов на ассемблере.

.model tiny
.code
org 100h
start:

mov ax,13h
int 10h
mov cx,256 ;Счетчик кругов для loop
mov ax,0003h ;Установка видеорижима 3, курсор в 0,0
int 10h ;и очистка экрана
mov ax,0b800h
mov es,ax ;Загружаем в дополнительный сегментный регистр абсол.адрес
mov di,0 ;Смещение относительно адреса 0b800h
mov ah,010b ;Атрибуты, цвет текста зеленый
mov al,00h ;ASCII код
mov es:[di],ax ;Грузим не в регистр а по адресу который наход. в регистре
;———————-
cloop:
add di,4 ;Смещение на 4 байта, чтобы выглядело нормально
inc al ;Следущий ASCII код
mov es:[di],ax ;Грузим по адресу в видеопамять
loop cloop ;Дальше.
;———————-
mov ah,10h ;Ждем нажатие Any Key
int 16h
ret
end start

Ассемблер с нуля. Часть 6. Первая программа.

Наша первая программа на ассемблере.

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

Читать еще:  Работа с матрицами в matlab

Ещё мы знаем, что в указанном формате пишутся резидентные программы, драйверы и вирусы.

Резидентная (TSR-программа, от англ. Terminate and Stay Resident) — это программа, которая после запуска передает управление операционной системе, но сама не завершается, а остаётся в оперативной памяти, реагируя на определённые действия пользователя. Например, при нажатии сочетания горячих клавиш делает снимок экрана.

Код в статьях отображается в удобочитаемой форме: каждая строка имеет свой номер, строки и код подсвечиваются. Чтобы скопировать «чистый исходник», наведите курсор мыши на текст, дождитесь всплывающего меню и нажмите в меню кнопочку «копировать» (изображение двух листочков бумаги с текстом). Чистый код не содержит нумерации строк!

Наша первая программа выведет на экран монитора (консоль) надпись «Hello, World!». Итак, как говорил Юрий Алексеевич, поехали!

Создаём исполняемый файл PRG.COM.

Для достижения нашей цели делаем следующее.

  • Скачиваем с нашего сайта архив (DOS-1.rar) с предустановленными DOSBox и программами. Запускаем DOSBox. Стартует эмулятор MS-DOS и Norton Commander пятой версии.
  • В папке D:TASM.2_0TASM находим текстовый файл PRG.ASM. Это обычный текстовый файл, который можно создать
    с помощью любого текстового редактора, с расширением ASM вместо TXT.
  • В файл вносим код:
  • В папке D:TASM.2_0TASM находим «батник» ASM-COM.BAT со следующим текстом:

Первая строка — запуск транслятора с названием нашего файла с кодом, расположенного в одной директории с транслятором.

Вторая строка — запуск компилятора с параметрами /t /x и название объектного файла — prg.obj, получившегося в результате выполнения первой команды.

Чтобы посмотреть список всех возможных параметров с пояснениями для файлов tasm.exe и tlink.exe необходимо запустить эти программы без параметров. Если вы сделаете это, не выходя из оболочки NC, то, чтобы просмотреть чистое окно DOS нажмите Ctrl+O, чтобы вернуться в NC, нажмите сочетание клавиш повторно.

  • После запуска ASM-COM.BAT в этой же директории появится файл prg.com. Запустив его мы увидим сообщение «Hello World!» в окне MS-DOS (при необходимости просмотра, снова применяем Ctrl+O).

Батник ASM-EXE.BAT предназначен для создания исполняемого файла формате *.EXE (предусматривает раздельную сегментацию для кода, данных и стека — наиболее распространённый формат исполняемых файлов DOS).

Батник COMPLEX.BAT предназначен для создания исполняемых файлов из двух файлов кода (названия обязательно должны быть prg.asm, prg1.asm).

Наша первая программа на ассемблере прекрасно работает!

TASMED (Tasm Editor) — среда разработки приложений DOS на ассемблере.

Выше мы рассмотрели стандартный подход к программированию на TASM в системе MS-DOS. Указанным алгоритмом создания программ можно пользоваться и далее.

Для более удобной работы с кодом целесообразно применять какую-либо среду разработки. Среда разработки — это громко сказано для времён MS-DOS, правильнее сказать — специфический редактор.

Можете попробывать TASMED в папке D:UTILSTASMED. Программа уже настроена и готова к использованию.

Первая программа на ассемблере в среде разработки TASMED.

  • подсветка ассемблерного синтаксиса;
  • возможность сохранения проектов под любым именем и в любой директории;
  • работа как с TASM, так и MASM.
  • только английский язык интерфейса, но английский программист должен знать лучше русского;
  • слишком много настроек для текстового редактора.
    Хотя, в принципе, настройки — не проблема. Основное, что необходимо настроить — это соответствующие пути:
    Options->External->Assembler
    Options->External->Linker
    В общем, разобраться не сложно.

Практические советы: группирование проектов, русский язык в MS-DOS.

Для удобства группирования создаваемых программ можно создать отдельную папку (мы создали папку PROJECTS) в которой создавать папки названий проектов, куда копировать соответствующие файлы. Пока у нас — это PRG.ASM, PRG.OBJ, PRG.EXE. Однако, в зависимости от параметров и наших программ их может быть больше (PRG.MAP, PRG.SYM и др.).

В нашем случае, все программы, рассматриваемые в курсе обучения будут группироваться в директории D:WORK в соответствующих папках. Например, наша первая программа в папке D:WORKPRGCOM (файлы prg.asm и prg.com). Папку D:TASM.2_0PROJECTS оставляем пустой для ваших проектов и экспериментов.

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

  1. Запустить драйвер русской раскладки клавиатуры. В нашей запущенной MS-DOS системе на базе DOSBox это файл C:KEYRUSkeyrus.com. Впрочем, при запуске MS-DOS согласно нашим настройкам DOSBox, он запустится автоматически. При этом будет обеспечено не только отображение русского текста в текстовых редакторах, но и русскоязычная раскладка клавиатуры. Переключение раскладки Eng->Rus и наоборот — горячая клавиша «правый CTRL».
  2. Текст исходников необходимо писать в текстовых редакторах или средах разработки DOS.
  3. Если исходники пишутся в Windows редакторах, должна быть обеспечена русскоязычная кодировка текста — ASCII для DOS (CP866 или OEM866).

Русскоязычная кодировка текста — программа просмотра файлов Total Commander. Русскоязычная кодировка текста — используем Notepad++.

Конечно вопрос снимается сам собой, если комментарии писать на английском.

В следующей статье мы разберём код нашей первой программы на ассемблере.

Программирование на Ассемблере для начинающих с примерами программ

Многие считают, что Assembler – уже устаревший и нигде не используемый язык, однако в основном это молодые люди, которые не занимаются профессионально системным программированием. Разработка ПО, конечно, хорошо, но в отличие от высокоуровневых языков программирования, Ассемблер научит глубоко понимать работу компьютера, оптимизировать работку с аппаратными ресурсами, а также программировать любую технику, тем самым развиваясь в направлении машинного обучения. Для понимания этого древнего ЯП, для начала стоит попрактиковаться с простыми программами, которые лучше всего объясняют функционал Ассемблера.

IDE для Assembler

Первый вопрос: в какой среде разработки программировать на Ассемблере? Ответ однозначный – MASM32. Это стандартная программа, которую используют для данного ЯП. Скачать её можно на официальном сайте masm32.com в виде архива, который нужно будет распаковать и после запустить инсталлятор install.exe. Как альтернативу можно использовать FASM, однако для него код будет значительно отличаться.

Перед работой главное не забыть дописать в системную переменную PATH строчку:

Программа «Hello world» на ассемблере

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

Для начала запускаем редактор qeditor.exe в папке с установленной MASM32, и в нём пишем код программы. После сохраняем его в виде файла с расширением «.asm», и билдим программу с помощью пункта меню «Project» → «Build all». Если в коде нет ошибок, программа успешно скомпилируется, и на выходе мы получим готовый exe-файл, который покажет окно Windows с надписью «Hello world».

Сложение двух чисел на assembler

В этом случае мы смотрим, равна ли сумма чисел нулю, или же нет. Если да, то на экране появляется соответствующее сообщение об этом, и, если же нет – появляется иное уведомление.

Здесь мы используем так называемые метки и специальные команды с их использованием (jz, jmp, test). Разберём подробнее:

  • test – используется для логического сравнения переменных (операндов) в виде байтов, слов, или двойных слов. Для сравнения команда использует логическое умножение, и смотрит на биты: если они равны 1, то и бит результата будет равен 1, в противном случае – 0. Если мы получили 0, ставятся флаги совместно с ZF (zero flag), которые будут равны 1. Далее результаты анализируются на основе ZF.
  • jnz – в случае, если флаг ZF нигде не был поставлен, производится переход по данной метке. Зачастую эта команда применяется, если в программе есть операции сравнения, которые как-либо влияют на результат ZF. К таким как раз и относятся test и cmp.
  • jz – если флаг ZF всё же был установлен, выполняется переход по метке.
  • jmp – независимо от того, есть ZF, или же нет, производится переход по метке.
Читать еще:  Delphi проверить существование файла

Программа суммы чисел на ассемблере

Примитивная программа, которая показывает процесс суммирования двух переменных:

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

Получение значения из командной строки на ассемблере

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

Также можно воспользоваться альтернативным методом:

Здесь используется invoke – специальный макрос, с помощью которого упрощается код программы. Во время компиляции макрос-команды преобразовываются в команды Ассемблера. Так или иначе, мы пользуемся стеком – примитивным способом хранения данных, но в тоже время очень удобным. По соглашению stdcall, во всех WinAPI-функциях переменные передаются через стек, только в обратном порядке, и помещаются в соответствующий регистр eax.

Циклы в ассемблере

Для создания цикла используется команда repeat. Далее с помощью inc увеличивается значение переменной на 1, независимо от того, находится она в оперативной памяти, или же в самом процессоре. Для того, чтобы прервать работу цикла, используется директива «.BREAK». Она может как останавливать цикл, так и продолжать его действие после «паузы». Также можно прервать выполнение кода программы и проверить условие repeat и while с помощью директивы «.CONTINUE».

Сумма элементов массива на assembler

Здесь мы суммируем значения переменных в массиве, используя цикл «for»:

Команда dec, как и inc, меняет значение операнда на единицу, только в противоположную сторону, на -1. А вот cmp сравнивает переменные методом вычитания: отнимает одно значение из второго, и, в зависимости от результата ставит соответствующие флаги.

С помощью команды jne выполняется переход по метке, основываясь на результате сравнения переменных. Если он отрицательный – происходит переход, а если операнды не равняются друг другу, переход не осуществляется.

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

Простейшая программа на ассемблере (beeper)

Ниже приведена программа на языке ассемблера MASM32, которая выводит на системный динамик первые восемь тактов вальса Грибоедова. Программа может быть скомпилирована в исполняемый файл (.exe). Для компиляции создайте новый текстовый документ в директории, расположенной на том же диске, где у вас установлен MASM32. Файл переименуйте в beeper.asm, скопируйте в него текст программы. Затем откройте этот файл с помощью MASM32 Editor, после чего в меню MASM32 Editor выберите опцию Project >> Assemble & Link. В той папке, где находится beeper.asm, обнаружится и скомпилированная программа, она будет называться beeper.exe.

Эта простейшая ассемблерная программа имеет набор директив, которые будут присутствовать в любой программе для MASM32. В первой строке записано указание компилятору на тип процессора, для которого создана программа. 386 — это третье поколение (1985) процессоров Intel, у которых регистры, внутренняя и внешняя шина данных впервые стали 32-разрядными. Таким образом, директива .386 означает, что программа написана для 32-разрядных процессоров Intel. Поскольку Intel-процесоры совместимы сверху вниз, программный код будет работать на всех версиях процессоров Intel, выпущенных после 1985 года.

Другие возможные варианты директивы, указывающей на тип процессора: .8086 , .186 , .286 (16 бит), .486 , .586 , .686 (32 бит). Дополнительно (отдельной строкой) могут быть указаны расширения системы команд процессора (прописными или строчными символами): .MMX , .XMM .

Комментарием считается любой набор символов, начинающийся с точкой с запятой и до конца строки. Например, в первой строке нашей программы запись ; 32-битный режим — это комментарий. Комментарии компилятор не обрабатывает.

Директива .model в записи flat указывает компилятору, что программу следует создать в плоской модели памяти, при этом в одном 32-разрядном сегменте будут содержаться и программа, и ее данные. Именно в таком формате операционная система Windows понимает исполняемые файлы, соответственно, указание компилятору на плоскую модель памяти подразумевает создание в конечном итоге .exe-файла. Плоская модель памяти применима только для 32-разрядных процессоров и выше.

Все понимаемые MASM32 модели пямяти: tiny , small , compact , medium , large , huge , flat .

При стандартном вызове функций параметры передаются через стек. Именно через стек обмениваются данными с программами встроенные функции операционной системы Windows (API-функции), поэтому, если мы планируем использовать в своей программе такие функции, мы должны записать в директиве .model опцию stdcall .

Директива option casemap :none дает указание компилятору неразличать прописные и строчные символы в написанной нами программе. Все варианты option casemap: all , none , notpublic .

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

Аналогично, директива includelib подключает к нашему проекту библиотечный файл.

Директивы .data и .code начинают сегмент данных и сегмент исполняемого кода соответственно и заканчивают предыдущий сегмент, если таковой имеется.

Директива invoke дает задание компилятору совершить вызов функции. В нашем случае вызываемая функция Beep — это API-функция Windows, она описывается следующим образом:
Function Beep Lib «kernel32» Alias DWORD «Beep» (DWORD dwFreq, DWORD dwDuration).
Из описания видно, что эта функция содержится в системном (входящем в состав операционной системы Windows) файле kernel32.dll. Поэтому, выше в программе нами были подключены файлы kernel32.inc и kernel32.lib, где содержатся необходимые ассемблеру инструкции для работы с библиотекой kernel32.dll.

Функции Beep должны быть переданы два значения — DWORD dwFreq и DWORD dwDuration. Запись DWORD (double word) конкретизирует размер памяти, которую занимает переменная. Double word — это два машинных слова (четыре байта или 32 бит). Указание размера памяти, отводимой под переменную, важно потому, что обмен данными с API-функциями программы производят через стек, в стек перед вызовом API-функции программа должна поместить как раз столько байт, сколько из него затем будет извлечено API-функцией. В противном случае вызов API-функции или исполнение программы после вызова может завершиться ошибкой.

И, наконец, dwFreq — это частота звука в Герцах, dwDuration — длительность звука в миллисекундах. В ассемблере передаваемые функции параметры записываются после ее имени через запятую, в том же порядке, что и в описании функции. Например, запись invoke Beep, 784, 900 после компиляции даст ноту соль второй октавы (ее частота 784 Гц) с длительностью звучания 0,9 секунды.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector