Пример программы на языке ассемблера

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

Имитация конструкции if..else

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

IF условие THEN выполняемые действия, если условие верно ELSE выполняемые действия, если условие НЕ верно END IF

Что касается ассемблера, то тут придется написать гораздо больше инструкций, чтобы построить логику, но в общем случае это выглядит примерно так:

CMP Xn, Operand2 B.NE else действия, если значения равны B endif else: действия, если значения НЕ равны endif:

Сначала инструкция CMP сравнивает значение некоторого регистра Xn с Operand2. Далее проверяем неравество B.NE else , и если значения НЕ равны, переходим на метку else . Если значения равны, то просто выполняются последующие инструкции ДО метки else .

06. Низкоуровневое программирование. Ассемблер. Пример программы. [Универсальный программист]

В данном случае применяется операция NE , которая проверяет, сброшен ли Z-флаг (что эквивалентно тому, что два значения не равны). Но естественно это может быть и другая операция сравнения.

После метки else идут инструкции, которые выполняются, если значения из инструкции CMP не равны.

Завершается все меткой endif , после которой идут инструкции остальной части программы.

Посмотрим на примитивном примере — сравним значение регистра с числом, и в зависимости от результата сравнения установим определенный код возврата — 1 (если значения равны) и 2 (если значения не равны):

// METANIT.COM. Пример программы с условной конструкцией, // которая сравнивает два значения .global _start _start: MOV X1, #5 // помещаем в X1 число 5 CMP X1, #6 // сравниваем значение из X1 с числом 6 B.NE _else // если равенство X1 == 5 не верно, переход к метке _else MOV X0, #1 // помещаем в регистр X0 в качестве кода возврата число 1 (значения равны) B _endif // переход к метке _endif для завершения условной конструкции _else: MOV X0, #2 // помещаем в регистр X0 в качестве кода возврата число 2 (значения НЕ равны) _endif: // завершение условной конструкции //выходим из программы MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы

Здесь помещаем в регистр X1 число 5, а затем с помощью инструкции CMP сравниваем его с число 6. Очевидно, что у нас значения не равны, поэтому инструкция B.NE увидит, что Z-флаг сброшен, и выполнит переход на метку _else , где в регистр X0 в качестве кода возврата из программы будет помещено число 2.

Читайте также:
Какое число будет напечатано на экране компьютера в результате выполнения фрагмента программы а 4

Затем выполняется переход к метке _endif , которая знаменуют окончание условной конструкции и за которой идут по сути остальные инструкции программы (в данном случае вызов функции выхода из программы)

Пишу программу в машинных кодах

Если бы значения были бы равны, то в регистр X0 было бы помещено число 1, а затем произошел переход к метке _endif .

Имитация конструкции switch..case

В ряде языков высокого уровня есть конструкция switch..case , которая последовательно сравнивает некоторое выражение с набором значений:

switch(выражение)

Общий алгоритм данной конструкции может быть следующим:

  1. С помощью CMP сравниваем значение регистра с некоторым значением.
  2. Если сравнение оказалось НЕ верным, то переходим к следующей метке, которая сравнивает значение регистра с новым значением. Если сравнение оказалось верным, то выполняем определенные действия и затем переходим к метке завершения конструкции.
  3. Если ни одно из сравнений в инструкциях CMP НЕ является верным, выполняем действия по умолчанию.

Например, определим следующую программу:

// METANIT.COM. Пример программы с условной конструкцией аля switch..case .global _start _start: MOV X1, #2 // помещаем в X1 сравниваемое значение — число 2 _case_1: CMP X1, #1 // сравниваем значение из X1 с первым значением — числом 1 B.NE _case_2 // если равенство X1 == 1 НЕ верно, переход к метке _case_2 MOV X0, #1 // помещаем в регистр X0 в качестве кода возврата число 1 B _endswitch // переход в конец конструкции _case_2: CMP X1, #2 // сравниваем значение из X1 с первым значением — числом 2 B.NE _case_3 // если равенство X1 == 2 НЕ верно, переход к метке _case_3 MOV X0, #2 // помещаем в регистр X0 в качестве кода возврата число 2 B _endswitch // переход в конец конструкции _case_3: CMP X1, #3 // сравниваем значение из X1 с первым значением — числом 3 B.NE _default // если равенство X1 == 3 НЕ верно, переход к метке _default MOV X0, #3 // помещаем в регистр X0 в качестве кода возврата число 3 B _endswitch // переход в конец конструкции _default: MOV X0, #10 // если предыдущие сравнения НЕ верны, помещаем в регистр X0 число 10 (значение по умолчанию) _endswitch: //выходим из программы MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы

Здесь в регистр X1 помещается сравниваемое значение — число 2. Далее идет набор меток _case_1/_case_2/_case_3, после которых инструкция CMP сравнивает значение регистра с некоторыми значениями. Если равенство значений не верно, то переходим к следующей метке. Если равенство сравнений верно, то помещаем в регистр X0 соответствующий код возврата из программы и переходим к метке _endswitch

В данном случае, поскольку в регистре X1 находится число 2, то в регистр X0 будет помещено число 2.

Бонус

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

Читайте также:
При каком условии можно создать автоматическое оглавление в программе word

// METANIT.COM. Пример программы с условной конструкцией, // которая сравнивает два значения .global _start _start: MOV X0, #1 // 1 = StdOut — поток вывода MOV X1, #5 // помещаем в X1 число 5 CMP X1, #6 // сравниваем значение из X1 с числом 6 B.NE _else // если равенство X1 == 5 не верно, переход к метке _else LDR X1, =equal // строка для вывода, если числа РАВНЫ MOV X2, #26 // длина строки B _endif // переход к метке _endif для завершения условной конструкции _else: // если значения не равны LDR X1, =notequal // строка для вывода, если числа НЕ РАВНЫ MOV X2, #32 // длина строки _endif: // вывод сообщения на консоль MOV X8, #64 // устанавливаем функцию Linux для вывода строки SVC 0 // вызываем функцию MOV X0, #0 // код возврата из функции — 0 MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы .data equal: .ascii «данные равныn» notequal: .ascii «данные НЕ равныn»

Источник: metanit.com

Примеры на Ассемблере

В Контакте Ютуб Почта

Примеры на Ассемблере позволяют, во-первых, потренироваться в программировании на этом языке, а во-вторых, более глубоко вникнуть в ассемблер и более полно в нём разобраться.

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

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

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

Для создания программ я буду использовать разные средства разработки. Обычно это будет текстовый редактор и какой-либо ассемблер.

Самые простые программы я буду создавать в Emu8086. Программы посложнее буду писать в текстовом редакторе PSPad, а компилировать либо с помощью TASM, либо с помощью MASM. Сам процесс компиляции (ассемблирования) я описывать не буду. Надеюсь, вы знаете, как это делается. Если нет, то см. по ссылкам выше.

ВАЖНО!
Не все программы будут работать в Windows NT или других операционных системах. Надеюсь, это тоже понятно.

ВАЖНО!
Некоторые примеры будут на языках высокого уровня, а код на ассемблере будет только в виде небольшой вставки. Это будет в тех случаях, когда надо показать простой пример на ассемблере, а загромождать исходный текст большими кусками кода не самых важных функций ввода-вывода не хочется.

Итак, вот что доступно на сегодняшний день:

  • Как вывести строку на экран в Ассемблере
  • Как узнать состояние флага
  • Как сложить два числа
  • Вычитание в Ассемблере
  • Ожидание нажатия клавиши
Читайте также:
Программа которая меняет видеокарту

Источник: av-assembler.ru

Программирование на языке ассемблера

Motorola 6800 и intel 8080 (пример 8)

Единственное изменение, которое нужно внести в рассмотренные в примере 7 программы для МП Motorola 6800 и Intel 8080, состоит в том, чтобы после команды СЛОЖИТЬ С ПЕРЕНОСОМ вставить команду DAA

Intel 8080 (пример 7)

В программе для МП Intel 8080 для обнуления признака ПЕРЕНОС используется команда SUB А (специальная команда ОБНУЛИТЬ ПРИЗНАК ПЕРЕНОС отсутствуем), а для выполнения сложения — команда СЛОЖИТЬ С

Motorola 6800 (пример 7)

В программе для МП Motorola 6800 сначала команда ОБНУЛИТЬ ПЕРЕНОС (CLC) обнуляет признак, а команда СЛОЖИТЬ С ПЕРЕНОСОМ (ADC) выпблняет сложение. Программа имеет вид: Motorola 6800 пример 7 Сложение

Вычислительные программы

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

Intel 8080 (пример 6)

Программа нахождения максимального элемента для МП Intel 8080 аналогична соответствующей программе для МП Motorola 6800. Для реализации соответствующих проверок в ней используются команды СРАВНИТЬ и

Motorola 6800 (пример 6)

В программе для Mn.Motorola 6800 для определения того, является -ли запись, кото рая. ранее, считалась максимальной, большей, чем вновь выбранная, используется команда сравнения (СМРА Щ. -Если в

Intel 8080 (пример 5)

В программе для МП Intel 8080 в качестве адресного регистра используется регистровая пара И и L. В этом микропроцессоре в качестве адресных регистров можно также кспользовать регистры’В и С

Motorola 6860 (пример 5)

В программе для МП Motorola 6800 фиксированное расстояние между исходной и результирующей областями используется в качестве значения смещения в индексируемой команде. Это дает возможность получить

Motorola 6800 (пример 4)

Программа сложения чисел для МП Motorola 6800 использует оба аккумулятора и индексный регистр. В аккумуляторе А содержится сумма, в аккумуляторе В—счетчик, а в индексном регистре —

Организация циклов и обработка массивов

Разумеется, реальные задачи, решаемые на ЭВМ, не сводятся к обработке отдельного элемента данных с помощью одной операции. Напротив, они требуют обработки многих элементов данных (например, массива

Intel 8080 (пример 3)

Программа разделения слова на части для МП Intel 8080 несколько длиннее соответствующей программы для МП Motorola 6800, поскольку в МП Intel 8080 отсутствует команда ЛОГИЧЕСКИЙ СДВИГ ВПРАВО Однако в

Motorola 6800 (пример 3)

Программа разделения исходного слова на две части для МП Motorola 6800 имеет вид: М6800 пример 3 Шестнадцатиричный адрес ячейки памяти

Intel 8080 (пример 2)

При выполнении операции выделения в программе для МП Intel 8080 используется возможность применения косвенной регистровой адресации, которая в программе на языке ассемблера указывается кодом регистра

Intel 8080 (пример 1)

Программа для МП Irrtel-8080 выглядог сложнее, поскольку в МП Irtfel 8080.невозможно выполнять сложениес использрванием прямой адресации. В результате требуется вспомогательная команда для пересылки

Простые программы

Пример 1. Сложение 8-битных чисел. По-видимому, самой простой программой, которую можно себе представить, является программа сложения двух чисел. Предположим, что нужно сложить содержимое ячеек

Источник: incpu.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru