Программы на ассемблере: Ассемблер. Создание программы на языке ассемблера

Содержание

Первая программа на Assembler. — it-black.ru

Первая программа на Assembler. — it-black.ru Перейти к содержимому

Вот и пришло время написать нашу первую программу на языке Assembler. Начнем мы с процессора Intel 8086. Будем писать программу под DOS. Программирование под Windows и Linux сложнее. Поэтому начнем с простого и понятного 16-битного процессора 8086.

DOS (дисковая операционная система, ДОС) — семейство операционных систем для персональных компьютеров, ориентированных на использование дисковых накопителей, таких как жёсткий диск и дискета.

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

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

Необходимые инструменты:


Для программирования на ассемблере нам необходим компилятор. Наиболее известные компиляторы это TASM, MASM и FASM. В этом курсе я решил использовать FASM. Это довольно новый, удобный, быстро развивающийся компилятор ассемблера, написанный на себе самом. Его преимущества — это поддержка сложных макросов и мультиплатформенность. Есть версии под DOS, Windows и Linux.

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

Если у вас Windows, тогда устанавливать надо на 32 битную версию (х86) т.

к. на 64 битной версии (х64) будет выдавать ошибку. Мой компьютер 64 битной версии, поэтому я установил Windows 7 32 bit на виртуальную машину и уже туда установил FASM. Как установить Windows на виртуальную машину я объяснял в своей статье «Установка Windows 7 на виртуальную машину«.

Приступим к написанию первой программы:


После всех манипуляций открывайте FASM и начнем писать код. Как и всегда мы напишем приветствие и выведим его в консоль. Я напишу код и внизу него объясню каждую строчку.


  use16
  org 100h
  mov dx,hello
  mov ah,9
  int 21h
  
  mov ax,4C00h
  int 21h
  
  hello db 'Hello, World!$'
  

«use16» — сообщает, что нужно генерировать 16-битный код. Нам нужен именно такой для нашей первой программы.

«org 100h» — объясняет, что следующие команды и данные будут располагаться в памяти, начиная с адреса 100h. Дело в том, что при загрузке нашей программы в память, DOS размещает в первых 256 байтах (с адресов 0000h — 00FFh) свои служебные данные. Нам эти данные изменять нежелательно.

«mov dx,hello» — Помещаем «hello» в регист dx. Делаем что-то типо переменной.

«mov ah,9» — пишем номер функции DOS.

«int 21h» — обращаемся к функции DOS.

«mov ax,4C00h и int 21h» — это стандартное завершение процесса в DOS. Так мы будем завершать все наши программы.

«hello db ‘Hello, World!$’» — сообщаем что в «hello» хранится наше приветствие, которое будет выведено в консоль.

Чтобы откомпилировать программу надо выбрать меню Run->Compile. FASM предложит сохранить файл, если вы этого ещё не сделали, а затем скомпилирует. То есть переведет текст, набранный нами, в машинный код и сделает его программой.

Далее откройте консоль на вашем компьютере (Пуск->Выполнить->cmd и нажимаем Enter, откроется консоль). Потом зайдите в папку где вы сохранили файлы программы, найдите файл с расширением .COM (приложение DOS) возьмите его мышкой перенесите в консоль (либо пропишите путь к этому файлу) и нажмите Enter. После таких манипуляций вы увидите в консоли наше приветствие. Вот так все и работает. Поздравляю все получилось!



Facebook

Twitter

  • 4 Comments

Группа в VK

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Облако меток

Похожие статьи

Команды работы с битами.

Работать с отдельными битами операндов можно, используя логические операции и сдвиги. Также в системе команд x86 существуют специальные команды для работы с битами: это команды

Основы создания макросов в Assembler.

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

Синтаксис объявления меток.

Метка в ассемблере – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду. Метка может содержать следующие символы: Буквы (от A до Z и

Локальные переменные.

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

Instagram Vk Youtube Telegram Odnoklassniki

Полезно знать

Рубрики

Авторы

Ассемблер ARM64 | Первая программа на ассемблере ARM64 на Linux

Последнее обновление: 27. 12.2022

Пакет gcc-aarch64-linux-gnu

Наиболее популярным способом компиляции программ на языке ассемблера ARM64 представляет применение компилятора GAS от проекта GNU. Под Linux есть ряд различных пакетов, в рамках которых распространяется этот компилятор. Выбор конкретного пакета зависит от того, под какую архитектуру мы собираемся компилировать приложение.

Если мы собираемся компилировать приложение непосредственно под Linux (в том числе под Android), то самым простым вариантом является использование пакета gcc-aarch64-linux-gnu. Рассмотрим его использование. Вначале установим пакет командой:

sudo apt-get install gcc-aarch64-linux-gnu

После установки нам станет доступно приложение aarch64-linux-gnu-as, которое представляет компилятор GAS для ARM64 под Linux. Кроме того, также будет доступен линкер в виде приложения aarch64-linux-gnu-ld. Например, проверим версию компилятора gas:


eugene@Eugene:~$ aarch64-linux-gnu-as --version
GNU assembler (GNU Binutils for Ubuntu) 2. 38
Copyright (C) 2022 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `aarch64-linux-gnu`.
eugene@Eugene:~$

В системе можно также найти компилятор и линкер в папке usr\aarch64-linux-gnu\bin, где они называются соответственно as и ld.

Создание первой программы

Теперь напишем первую простейшую программу, которая просто будет выводить на консоль некоторую строку. Для этого создадим в каталоге пользователя какой-нибудь каталог, например, arm. Создадим в этого каталоге новый файл hello.s (обычно файлы с кодом ассемблера arm имеют расширение .s). Определим в этом файл следующий код:


.global _start          // устанавливаем стартовый адрес программы

_start: mov X0, #1          // 1 = StdOut - поток вывода
 ldr X1, =hello             // строка для вывода на экран
 mov X2, #19                // длина строки
 mov X8, #64                // устанавливаем функцию Linux
 svc 0                      // вызываем функцию Linux для вывода строки

 mov X0, #0                 // Устанавливаем 0 как код возврата
 mov X8, #93                // код 93 представляет завершение программы
 svc 0                      // вызываем функцию Linux для выхода из программы

.
data hello: .ascii "Hello METANIT.COM!\n" // данные для вывода

Для большего понимания я снабдил программу комментариями. GNU Assembler использует тот же самый синтаксис комментариев, что и C/C++ и другие си-подобные языки: одиночный комментарий начинается с двойного слеша //. Также можно использовать многострочный комментарий с помощью символов /∗ и ∗/, между которыми помещается текст комментария (/* текст комментария */

Вначале надо указать линкеру (в нашем случае программа ld) стартовую точку программы. В данной программе стартовая точка программы проецируется на метку

_start. И чтобы линкер получил к ней доступ, определяет _start в качестве глобальной переменной с помощью оператора global.

.global _start

Одна программа может состоять из множества файлов, но только один из них может иметь точку входа в программу _start

Далее идут собственно действия программы. Вначале вызывается инструкция mov, которая помещает данные в регистр.

mov X0, #1

Значения X0-X2 представляют регистры для параметров функции в Linux. В данном случае помещаем в регистр X0 значение «#1». Операнды начинаются со знака «#» Число 1 представляет номер стандартного потока вывода «StdOut».

Далее загружаем в регистр X1 адрес строки для вывода на экран с помощью инструкции ldr

ldr X1, =hello 

Затем также с помощью инструкции mov помещаем в регистр X2 длину выводимой строки

mov X2, #19

Для любого системного вызова в Linux параметры помещаются в регистры X0–X7 в зависимости от количества. Затем в регистр X0 помещается код возврата. А сам системный вызов определяется номером функции из регистра X8. Здесь помещаем в X8 функцию с номеро 64 (функция write)

mov X8, #64

Далее выполняем системный вызов с помощью оператора svc

svc 0 

Операционная система, используя параметры в регистрах и номер функции, выведет строку на экран.

После этого нам надо выйти из программы. Для этого помещаем в регистр X0 число 0

mov X0, #0

А в регистр X8 передаем число 93 — номер функции для выхода из программы (функция exit)

mov X8, #93

И с помощью svc также выполняем функции. После этого программа должна завершить выполнение.

В самом конце программы размещена секция данных


.data
hello: .ascii "Hello METANIT.COM!\n"    // данные для вывода

Оператор .data указывает, что дальше идет секция данных. Выражение .ascii выделяет память и помещает в нее указанную далее строку.

Строка завершается символом перевода строки «\n», чтобы не надо было нажимать на Return, чтобы увидеть текст в окне терминала.

Компиляция приложения

Для компиляции приложения откроем терминал/командную строку и командой cd перейдем к папке, где расположен файл hello.s с исходным кодом программы. И для компиляции выполним команду:


aarch64-linux-gnu-as hello. s -o hello.o

Компилятору aarch64-none-elf-as в качестве параметра передается файл с исходным кодом hello.s. А параметр -o указывает, в какой файл будет компилироваться программа — в данном случае в файл hello.o. Соответственно в папке программы появится файл hello.o

Затем нам нужно скомпоновать программу с исполняемый файл с помощью линкера aarch64-none-elf-ld командой:


aarch64-linux-gnu-ld hello.o -o hello

После этого в папке программы появится исполняемый файл hello, который мы можем запускать на устройстве с архитектурой ARM64 под управлением Linux.

Установка Arm GNU Toolchain

Выше рассматривалась компиляция с помощью компилятора и линкера из пакета gcc-aarch64-linux-gnu. Этот пакет применяется для компиляции программы, которая выполняется напосредственно на Linux (на arm-архитектуре). Но кроме этого, мы можем использовать непривязанные к определенной системе пакеты (то что называется bare metall). Одним из наиболее популярных подобных пакетов является комплект инструметов Arm GNU Toolchain, который можно найти на странице https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads. Здесь представлены поседние версии Arm GNU Toolchain для разных архитектур.

Каждая версия Arm GNU Toolchain привязана к определенной версии компиляторов GCC. Например, версия Arm GNU Toolchain 12.2.Rel1 привязан к версии 12.2 набора компиляторов gcc.

Для Linux есть пакеты, которые можно использовать как на архитектуре x86-64, так и на ARM64. Доступно несколько групп пакетов под различные архитектуры. Так, для архитектуры x86-64 доступны следующие пакеты:

  • AArch42 bare-metal target (arm-none-eabi): для компиляции программ под 32-битные архитектуры без привязки к конкретной операционной системе

  • AArch42 GNU/Linux target with hard float (arm-none-linux-gnueabihf): для компиляции программ под 32-битную ОС Linux

  • AArch64 bare-metal target (aarch64-none-elf): для компиляции программ под 64-битные архитектуры без привязки к конкретной операционной системе

  • AArch64 GNU/Linux target (aarch64-none-linux-gnu): для компиляции программ под 64-битную ОС Linux

  • AArch64 GNU/Linux big-endian target (aarch64_be-none-linux-gnu): то же самое, что и предыдущий пункт, только с использованием порядка байтов Big Indian

Для архитектуры AArch64 (ARM64) доступны следующие пакеты:

  • AArch42 bare-metal target (arm-none-eabi): для компиляции программ под 32-битные архитектуры без привязки к конкретной операционной системе

  • AArch42 GNU/Linux target with hard float (arm-none-linux-gnueabihf): для компиляции программ под 32-битную ОС Linux

  • AArch64 bare-metal target (aarch64-none-elf): для компиляции программ под 64-битные архитектуры без привязки к конкретной операционной системе

Поскольку в нашем случае мы работаем с ARM64, то нас интересуют прежде всего пакеты AArch64 bare-metal target (aarch64-none-elf) и AArch64 GNU/Linux target (aarch64-none-linux-gnu). Второй пакет — AArch64 GNU/Linux target (aarch64-none-linux-gnu) в принципе аналогичен выше рассмотренному пакету gcc-aarch64-linux-gnu — используется только для компиляции под Linux. А первый пакет AArch64 bare-metal target (aarch64-none-elf) не привязан к определенной ОС, поэтому выберем его. Например, у меня архитектура х86-64, поэтому в млоем случае это архивный пакет arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz. Загрузим данный архив.

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

sudo mkdir /opt/aarch64-none-elf

Далее для распаковки архива в созданный каталог «opt/aarch64-none-elf» выполним следующую команду:


sudo tar -xvf ~/Загрузки/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz --strip-components=1 -C /opt/aarch64-none-elf

В данном случае предполагается, что архив загружен в папку «Загрузки» в папке текущего пользователя. После этого в папке текущего пользователя в каталоге opt/aarch64-none-elf/bin мы найдем файлы aarch64-none-elf-as и aarch64-none-elf-ld — компилятор и линкер соответственно.

Добавим в переменную PATH путь к компилятору и линкеру в папке bin. Для этого откроем выполним следующую команду:

echo 'export PATH=$PATH:/opt/aarch64-none-elf/bin' | sudo tee -a /etc/profile.d/aarch64-none-elf.sh

Чтобы изменения вступили в силу без необходимости перезагрузки, выполним команду

source /etc/profile

Проверим установку, выведя на консоль версию с помощью следующей команды:

aarch64-none-elf-as --version

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


aarch64-none-elf-as hello.s -o hello.o

Затем нам нужно скомпновать программу с исполняемый файл с помощью линкера aarch64-none-elf-ld командой:


aarch64-none-elf-ld hello. o -o hello

Тестирование на Android

Итак, у нас есть исполняемый файл программы. Мы ее можем протестировать. Для этого нам нужен Linux на устройстве с архитектурой ARM. В качестве такого устройства я возьму самый распространенный вариант — смартфон под управлением Android. Поскольку Android построен на базе Linux и как правило устанавливается на устройства с arm архитектурой.

Для установки файла на Android нам понадобится консольная утилита adb (Android Debug Bridge), которая используется для отладки приложений под Android и которая устанавливается в рамках Android SDK. Android SDK обычно устанавливается вместе с Android Studio. Но мы также можем установить ADB отдельно. Для этого выполним команду

sudo apt-get install adb

Теперь переместим скомпилированный файл hello на устройство под Android. Для этого прежде всего подключим к компьютеру смартфон с Android. Перейдем в консоли с помощью команды cd к папке с файлом hello и выполним следующую команду


adb push hello /data/local/tmp/hello

То есть в данном случае используем команду push для помещения копии файла hello на смартфон в папку /data/local/tmp/

Далее перейдем к консоли устройства Android с помощью команды:

adb shell

Далее перейдем к папке /data/local/tmp с помощью команды

cd /data/local/tmp

Затем изменим режим файла, чтобы его можно было запустить:

chmod +x hello

и в конце выполним файл hello

. /hello

И на консоль должна быть выведена строка «Hello METANIT.COM!»

НазадСодержаниеВперед

Bixoft — Примеры программ на ассемблере

Bixoft — Примеры программ на ассемблере

Эта страница содержит следующие фрагменты кода:

  • Стандартная связь подпрограммы
  • Условная сборка
  • Самомодифицирующийся код
  • Реентерабельная обработка наборов данных

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

Регистр Функция
Регистр 0 Рабочий регистр, в основном используется как параметр
Регистр 1 Рабочий регистр, обычно используемый как указатель на список параметров или поле результата
Регистры 2-11 Может свободно назначаться внутри каждой программы
Регистр 12 Базовый регистр для адресации внутри программы
Регистр 13 Указатель на свободную область сохранения
Регистр 14 Рабочий регистр, обычно используемый для обратных адресов
Регистр 15 Workregister, используется для адреса подпрограммы или (по возврату) возвращаться- и коды причин

Стандартный вызов подпрограммы.

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

  • При звонке:
    • Регистр 0 содержит параметр (при необходимости)
    • Регистр 1 содержит адрес списка параметров
    • Регистр 13 содержит адрес области сохранения
    • Регистр 14 содержит обратный адрес
    • Регистр 15 содержит адрес точки входа вызываемого программа
  • По возвращении:
    • Регистр 0 может быть изменен или не изменен
    • Регистр 1 содержит адрес (если применимо) результатов
    • Регистры со 2 по 14 без изменений
    • Регистр 15 содержит возврат и (если применимо) код причины

Область сохранения состоит из 18 полных слов (по 4 байта каждое) и занимает этим правила:

Местоположение Содержание
Х’00’ Зарезервировано для PL/I
Х’04’ Указатель на предыдущую область сохранения (т. е. регистр 13)
Х’08’ Указатель на следующую область сохранения
Х’0С’ Регистр 14
Х’10’ Регистр 15
Х’14’ Регистр 0
и т. д. до регистра 12

Далее следуют три фрагмента кода:

  1. Вызов подпрограммы.
  2. Вызываемая многоразовая программа.
    Этот пример можно использовать только для многоразовых и однократных программы, но не для повторно вводимых или обновляемых программ.
  3. Вызываемая обновляемая программа.
    Этот пример предназначен для программ с возможностью повторного ввода и обновления. Конечно его можно использовать как для многоразовых, так и для одноразовых программ.

*
* Пример вызова подпрограммы.
*
* Мы предполагаем, что список параметров настроен
         LA R1,PLIST Reg.1 указывает на список параметров
         L R15,=V(SUBPROG) Адрес подпрограммы в регистре 15
         BALR R14,R15 Заполнить регистр 14 и вызвать подпрограмму
* Обработайте результат
         LTR R0, R15 Сохранить и проверить код возврата
         BNZ ERROR Код возврата не равен нулю: обработка ошибок
ХОРОШЕЕ ОБОРУДОВАНИЕ *
* . .. Другой программный код
ОШИБКА N R15,=X'00000FFF' Удалить код причины
         L R15,ERRORS(R15) Получить адрес процедуры обработки ошибок из
 стол
         BR R15 И выполнить программу ошибок
*
* Процедуры обработки ошибок для обработки неожиданных результатов от SUBPROG
* При входе reg.0 содержит коды возврата и причины
ОШИБКИ DC AL4(хорошо) Результат в порядке
         DC AL4(RETCD4) Код возврата 4: предупреждение
         DC AL4 (RETCD8) Код возврата 8: проблема
         DC AL4 (RETCD12) Код возврата 12: не определено
         DC AL4 (RETCD16) Код возврата 16: фатальная ошибка
 

*
* Пример вызываемой программы (одноразовой или многоразовой)
* Этот пример нельзя использовать для программ с возможностью повторного ввода или обновления.
*
ПОДПРОГРАММА CSECT
         USING SUBPROG,R15 Регистр 15 содержит адрес
ПОДПРОГ
         B СТАРТ Пропустить данные
         DC C'SUBPROG ' Имя программы
         DC C'&SYSDATE' Дата
         DC C'&SYSTIME' Время
         DC C'V1R2. 05' Номер версии
         DS 0H Повторное выравнивание по границе полуслова
*
START STM R14,R12,12(R13) Сохранить регистры
         DROP R15 Больше не нужен в качестве базовой регистрации
         LR R12,R15 Заполните регистр 12 базовым адресом
         ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММЫ, R12 Теперь используйте reg.12 в качестве основы.
         LA R14,SAVEAREA Адрес новой области сохранения
         ST R13,4(R14) Указатель на предыдущую область сохранения
         ST R14,8(R13) Указатель на следующую область сохранения
         LR R13,R14 R13 снова указывает на свободную область сохранения
* ... Другой программный код
EXIT L R13,4(R13) Получить адрес предыдущей области сохранения
         LM R14,R12,12(R13) Восстановить все регистры (кроме 13)
         LA R15,... Код возврата в регистре 15
         BR R14 Возврат к вызывающему абоненту
         База DROP R12 больше не нужна
*
         LTORG Все литералы
SAVEAREA DS 18F Область сохранения
 

*
* Пример вызываемой программы (обновляемой или повторно вводимой)
* Этот пример также можно использовать для программ многократного или одноразового использования. 
*
ПОДПРОГРАММА CSECT
         USING SUBPROG,R15 Регистр 15 содержит адрес
ПОДПРОГ
         B СТАРТ Пропустить данные
         DC C'SUBPROG ' Имя программы
         DC C'&SYSDATE' Дата
         DC C'&SYSTIME' Время
         DC C'V1R2.05' Номер версии
         DC 0H Повторное выравнивание по границе полуслова
*
START STM R14,R12,12(R13) Сохранить все регистры
         DROP R15 Больше не нужен в качестве базы
         LR R12,R15 Заполните регистр 12 базовым адресом
         ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММЫ, R12 Используйте регистр 12 в качестве основы.
         LA R1,PRIVATE_LEN Требуемый объем памяти
         GETMAIN RU,LV=(R1) Выделить память для области сохранения и т.д.
* Адрес выделенного хранилища теперь в регистре 1
         USING PRIVATE,R13 Сделать хранилище адресуемым
         ST R13,4(R1) Указатель на предыдущую область сохранения
         ST R1,8(R13) Указатель на следующую область сохранения
         LR R13,R1 R13 снова указывает на свободную область сохранения
* ... Другой программный код
ВЫХОД LR R1,R13 Сохранить адрес нашей частной зоны
         L R13,4(R13) Получить адрес предыдущей области сохранения
         LA R2,ЧАСТНЫЙ_LEN
         FREEMAIN A=(R1),LV=(R2) Свободное выделенное хранилище
         LM R14,R12,12(R13) Восстановить все регистры (кроме 13)
         LA R15,. .. Код возврата в регистре 15
         BR R14 Возврат к вызывающему абоненту
         База DROP R12 больше не нужна
*
         LTORG Все литералы
*
* Эта dsect описывает все переменные, приватные для каждого вызывающего объекта.
ЧАСТНАЯ DSECT
SAVEAREA DS 18F
* ... Другие частные переменные
PRIVATE_LEN EQU *-ЧАСТНЫЙ
 

Условная сборка.

В следующем примере показано применение условного сборка. Первый показан макрос, который проверяет содержимое JCL-переменной СИСПАРМ. Это означает оптимизацию программы, которая должна быть сгенерирована и включение срабатывает отладочный код.
Макрос задает две переменные, которые можно тестировать на протяжении программа для генерации кода по желанию. Некоторые примеры такой логики приведены как хорошо. Ниже приведены следующие четыре фрагмента кода:

  1. Макрос, как описано выше.
  2. Вызов макроса.
    Этот вызов присваивает глобальным переменным &DBG и &OPT их намеревался ценности.
  3. Использование этих переменных для установки других переменные.
    Здесь мы демонстрируем, как можно использовать переменную &DBG для управления в вариант печати.
  4. Направление кодогенерации с использованием переменные.
    Здесь мы демонстрируем, как параметр оптимизации можно использовать в открытых код.

         МАКРО
         CHECKPRM
.*
.* Программа на ассемблере (ASMA90) принимает в качестве JCL-параметра a
.* спецификация переменной SYSPARM. Значение, введенное в
.* JCL будет передан символу глобального набора с именем &SYSPARM.
.* Значение, указанное в JCL, передается как одна строка.
.* Опции отделяются друг от друга запятой - без пробелов.
.* Этот макрос разбивает строку на отдельные параметры.
.* Затем параметры проверяются и обрабатываются. 4 разных ключевых слова
.* разрешается:
.* - DEBUG : генерировать отладочный код (процедура Snap и т. д.)
.* - NODEBUG: не генерировать отладочный код
.* - OPT: создать оптимизированную программу
. * - NOOPT: создание полнофункциональной программы.
.*
*
* Макрос CHECKPRM тестирует JCL-переменную SYSPARM и устанавливает два глобальных
* переменные для отображения содержимого SYSPARM:
* &DBG включен, чтобы включить код отладки, выключен, чтобы пропустить этот код
* &OPT включен для генерации оптимизированного кода, выключен для полного
* функциональный код.
*
         ГБЛБ &ДБГ,&ОПТ
&DBG SETB 0 По умолчанию: нет кода отладки
&OPT SETB 1 По умолчанию: полная оптимизация
         AIF ('.&SYSPARM' EQ '.').ВЫХОД
*
* Сначала мы разбиваем строку SYSPARM на подстроки
*
         LCLC &P(5) Массив, содержащий подстроки (пармы)
         LCLA &I,&N,&X
&I SETA 0 Индекс символов для &SYSPARM
&N SETA 1 Следующая позиция для извлечения
&X SETA 1 Счетчик параметров (массив индексов &P)
*
.LOOP1 АНОП
&I SETA &I+1 Увеличить индекс символа
         AIF (&I GT K'&SYSPARM.LOOP1X Конец строки?
         AIF ('&SYSPARM'(&I,1) NE ',').LOOP1 Конец подстроки?
.* Поместить подстроку в массив &P
&P(&X) SETC '&SYSPARM'(&N,&I-&N) Извлечь подстроку
&N SETA &I+1 Установить указатель на начало следующей подстроки
&X SETA &X+1 Увеличение счетчика подстроки
         НАЗАД . LOOP1 Перейти к следующему символу
.*
.LOOP1X ANOP Точка выхода для цикла 1
&P(&X) SETC '&SYSPARM'(&N,&I-&N) Извлечь последнюю подстроку
.*
.* Проверить действительность ключевых слов (теперь в массиве &P)
.*
&I SETA 0 Индекс в массиве &P
.LOOP2 АНОП
&I SETA &I+1 Увеличение указателя параметра
         AIF (&I GT &X).LOOP2X Готово? (&X содержит количество параметров)
         AIF ('.&P(&I)' EQ '.').LOOP2 Пропустить пустой параметр
         AIF ('.&P(&I)' EQ '.OPT').OPT Включить оптимизацию
         AIF ('.&P(&I)' EQ '.NOOPT').NOOPT Отключить оптимизацию
         AIF ('.&P(&I)' EQ '.DEBUG').DEBUG Включить логику отладки
         AIF ('.&P(&I)' EQ '.NODEBUG').NODEBUG Пропустить логику отладки
.* Недопустимое значение: выдать предупреждение и продолжить
         MNOTE 4, 'Недопустимый операнд SYSPARM: &P(&I)'
         AGO .LOOP2 Перейти к следующему параметру
.*
.ОПТ АНОП
&ОПТ НАБОР 1
         MNOTE 0, «Будет создано оптимизированное кодирование»
         НАЗАД .LOOP2
.*
.НООПТ АНОП
&ОПТ НАБОР 0
         MNOTE 0, «Будет создано отказоустойчивое кодирование»
         НАЗАД . LOOP2
.*
.ОТЛАДКА АНОП
&DBG НАБОР 1
         MNOTE 0, 'Код отладки будет включен'
         НАЗАД .LOOP2
.*
.NODEBUG ANOP
&DBG НАСТРОЙКА 0
         MNOTE 0, 'Код отладки будет исключен'
         НАЗАД .LOOP2
.*
.LOOP2X ANOP Точка выхода для цикла 2
.EXIT ANOP Точка выхода для пустого SYSPARM
         ИСПРАВИТЬ
 

*
* Глобальный параметр &DBG управляет параметрами сборки отладки/узла.
* - Когда &DBG = 1, то отладка активна
* Оптимизация глобального управления &OPT
* - При &OPT = 1 происходит оптимизация
* - При &OPT = 0 будет включена отказоустойчивость
*
         ГБЛБ &ДБГ,&ОПТ
         CHECKPRM Проверьте &SYSPARM, чтобы установить &DBG и &OPT
*
SOMEPROG CSECT
НЕКОТОРЫЕ ПРОГРАММЫ 31
SOMEPROG RMODE ЛЮБОЙ
*
         ... Здесь следует кодировка.
 

* Теперь установите параметры печати
         Вариант печати GBLC &PRT Controls
&PRT SETC 'NOGEN' По умолчанию nogen
         AIF (NOT &DBG).NOGEN Отладка активна?
&PRT SETC 'GEN' Да: создать полный список
. НОГЕН АНОП
         PRINT &PRT Активировать опцию печати
*
 

*
* Этот фрагмент кода перемещает данные, как указано в элементе управления перемещением.
* Перемещаемые данные могут иметь длину до 32767 байт.
*
* R6 теперь указывает на элемент управления движением.
* R8 будет использоваться как указатель источника, R9содержащий длину.
* R10 будет использоваться как указатель назначения.
*
          ИСПОЛЬЗОВАНИЕ MOVECTL,R6 Сделать область управления перемещением адресной
          L R8,MCRECPTR Указывает на начало записи
          AH R8,MCRECOFS Добавить смещение к соответствующим данным
          LH R9,MCDATLEN Загрузить длину данных
          L R10,MCDEST Указать на область назначения
*
* Теперь для перемещения данных мы обычно кодируем MVCL-инструкцию,
* так как MCDATLEN может указывать любое количество данных до 32767 байт.
* Поскольку известно, что в настоящее время ни один MOVECTL-элемент не указывает
* длина более 256, мы можем оптимизировать код с помощью MVC
* вместо MVCL. 
*
          AIF (&OPT).OPTMOVE
          ЛР Р11, Р9Целевая длина всегда экв. Источник-len
          MVCL R10, R8 Переместить данные
          НАЗАД .MOVEDONE
.*
.OPTMOVE ANOP
          BCTR R9,R0 Уменьшить длину на 1 для MVC
          EX R9,MOVEDATA Выполнить MVC-инструкцию
          Б ПЕРЕМЕЩЕН
MOVEDATA MVC 0(0,R10),0(R8) Переместить данные
МОВЕДОН ЭКВ *
*
.MOVEDONE ANOP
          DROP R6 MOVECTL больше не нужен
 

Самомодифицирующийся код.

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

  1. Процедура инициализации.
    Эта подпрограмма выполняется только один раз путем изменения условия перехода в начало рутины.
  2. Печать в две колонки.
    В этом примере показано очень уродливое решение для двухколоночной печати. проблема, что делает изменение кода операции инструкции. Код операции измененный с SH на AH и наоборот, переводя указатель столбца в положение и сюда.
    Гораздо лучшим решением было бы выделить буфер, достаточно большой к разместить все строки на странице. Тогда можно было бы заполнить все левый столбец — сверху вниз — до заполнения крайней правой колонки. Большинство конечные пользователи предпочитают такая вертикально перечисленная информация.

* ... Настройка адресации и т.д.
INIT BC X'00',INITDONE Эта ветвь никогда не
         OI INIT+1,X'F0' Сделать предыдущую ветвь ветвью - всегда
* ... Здесь идет код инициализации
INITDONE EQU * Конец процедуры инициализации
 

         L R1,LINEPTR Получить последний использованный указатель в LINE
SETPTR SH R1,=H'50' Переключиться на другой столбец (изначально: SH)
         XI SETPTR,X'01' Изменить AH на SH или наоборот
         ST R1,LINEPTR Сохранить обновленный указатель
         MVC 0(40,R1),DATA Переместить данные в строку печати
         . .. Другая кодировка для печати строки
ЛИНИЯ ПОСТОЯННОГО ТОКА CL133' '
         DS 0F Повторное выравнивание по границе полного слова
LINEPTR DC AL4(LINE+67) Чтобы начать печать данных в
* левый столбик, делаем вид, что последний
* перемещение было в правую колонку.
 

Реентерабельная обработка набора данных.

Для обработки набора данных VSAM необходимы как ACB, так и RPL. В приведенном ниже примере показано, как создать ACB и RPL в возвращающийся программа. Вы можете предположить, что все именованные места хранения были распределяются динамически и что к ним можно обращаться с помощью DSECT.


*
SUBROUTN STM R14,R12,12(R13) Сохранить все регистры
         LA R1,SAVEAREA Адрес новой области сохранения
         ST R13,4(R1) Указатель на предыдущую область сохранения
         ST R1,8(R13) Указатель на следующую область сохранения
         LR R13,R1 Reg.13 указывает на свободную зону сохранения
                                     снова
*
* Сначала выделяем хранилище для ACB и RPL
*
         GETMAIN RC,LV=IFGACBLV+IFGRPLLV Запрос хранилища для ACB + RPL
         LTR R15, R15 Getmain в порядке?
         BNE ERROR16 Ошибка обрабатывается в другом месте
         ST R1,ACBPTR Сохранить указатель на ACB
         LA R1,IFGACBLV(R1) Указывает на RPL-часть области
         ST R1,RPLPTR Сохранить указатель на RPL
*
* Выделить хранилище для рабочей области
*
         ПОЛУЧИТЬ RC, LV = 4096,BNDRY=PAGE Запрос хранилища для рабочей области
         LTR R15, R15 Getmain в порядке?
         BNE ERROR16 Ошибка обрабатывается в другом месте
         ST R1,WORKPTR Сохранить указатель на рабочую область
*
* Создайте PLIST для GENCB ACB в области getmained. 
* Для этого GENCB не предусмотрен код возврата.
*
         SR R6,R6 Очистить регистр 6
         IC R6,SHRPOOL, чтобы содержать номер shrpool
         L R7,WORKPTR Указывает на рабочую область для создания PLIST
         ИСПОЛЬЗОВАНИЕ РАБОЧЕЙ ЗОНЫ, R7
         GENCB BLK=ACB, сгенерировать PLIST для GENCB ACB *
               AM=VSAM, метод доступа *
               WAREA=(R7), Место для сгенерированного ACB *
               LENGTH=IFGACBLV, максимальная длина сгенерированного ACB *
               DDNAME=(*,DDNAME), GENCB ACB копирует DDNAME *
               SHRPOOL=(S,0(R6)), номер Shrpool варьируется от 0 до 15 *
               MACRF=(KEY,DFR,SEQ,SKP,SIS,NSR), Опции для этого ACB *
               BUFND=8, минимальное количество буферов данных *
               BUFNI=1, минимальное количество индексных буферов *
               RMODE31=ALL, Буфер и блоки управления выше 16M *
               MF=(L,WORKAREA,GENACBLV) Создать PLIST в WORKAREA
*
* Теперь создайте ACB, используя PLIST в WORKAREA. 
*
         GENCB BLK=ACB,MF=(E,(R7)) Создать ACB с помощью PLIST в WORKAREA
         LTR R15, R15 ACB создан?
         BNZ ERROR17 Ошибка обрабатывается в другом месте
         DROP R7 WORKAREA больше не нужен
*
* Создайте PLIST для GENCB RPL в области getmained.
* Для этого GENCB не предусмотрен код возврата.
*
         SR R6,R6 Очистить регистр
         IC R6,KEYLV для указания длины ключа
         L R7,ACBPTR Указывает на ACB
         LH R8,RECDLV Указать длину записи
         Л Р9,RPLPTR И указать местоположение для сгенерированного RPL
         L R10,WORKPTR Переадресация рабочей области
         ИСПОЛЬЗОВАНИЕ РАБОЧЕЙ ЗОНЫ, R10
*
         GENCB BLK=RPL, создать PLIST для GENCB RPL *
               AM=VSAM, метод доступа *
               WAREA=(R9), место для сгенерированного RPL *
               LENGTH=IFGRPLLV, максимальная длина сгенерированного RPL *
               ACB=(R7), Укажите ACB-адрес для RPL *
               AREA=(S,RECDPTR), указать область данных для записей *
               AREALEN=4, длина области данных *
               ARG=(S,KEYPTR) Указать расположение ключа *
               KEYLEN=(S,0(R6)), И длина ключа в байтах *
               ECB=(S,ECBPTR) Указать ECB-адрес *
               RECLEN=(R8), И длина записи *
               OPTCD=(KEY,SEQ,ASY,NUP,KGE,GEN,LOC), Опции для RPL *
               MF=(G,РАБОЧАЯ ОБЛАСТЬ,GENRPLLV)
*
* Теперь создайте RPL, используя PLIST в WORKAREA. 
*
         GENCB BLK=RPL,MF=(E,(R10)) Сгенерировать RPL, используя PLIST в WORKAREA
         LTR R15, R15 RPL создан?
         BNZ ERROR18 Ошибка обрабатывается в другом месте
*
* Теперь, когда мы создали и ACB, и RPL, мы можем открыть набор данных
*
         L R2,=AL4(VSAMOPEN) Получить адрес открытой формы-списка
         MVC WORKAREA(VSAMOPLV),0(R2) Скопировать в рабочую область
         L R2,ACBPTR Перезагрузить указатель ACB
         OPEN ((R2)),MF=(E,(R10)) Открытый ACB с изменяемым PLIST
         LTR R15, R15 Набор данных успешно открыт?
         БНЗ ОШИБКА19Ошибка обрабатывается в другом месте
*
* Возврат из подпрограммы
*
         L R13,4(R13) Получить адрес предыдущей области сохранения
         LM R14,R12,12(R13) Восстановить все регистры (кроме 13)
         BR R14 Вернуться к основной линии
*
* Форма списка по умолчанию для открытого макроса
*
VSAMOPEN OPEN (0), ACB-адрес еще не известен *
               MODE=31, включить 31-битную адресацию *
               MF=L Генерировать только PLIST
 

Замечания? Вопросы? Больше информации? Выберите тему вашего выбор или напишите нам с вашим вопросы.

 

Пример стандартного вызова подпрограммы.
Пример условной сборки.
Пример самомодифицирующегося кода.
Пример обработки набора данных с повторным входом.


 

Этот сайт является членом WebRing.
Вам предлагается просмотреть список сайтов, которые любят мейнфреймы.
Динозавры не мертвы. Они живы и здоровы и живут в данных центрирует все вокруг тебя. Они говорят на языках и творят странную магию с компьютеры. Осторожно, дино! И на всякий случай вы ждете финала кончина эти динозавры: помните, что динозавры правили миром на 155 миллионов годы!
Диносы и прочие анахронизмы
[ Присоединяйся сейчас | Кольцевой концентратор | Случайный | << Пред. | Далее >> ]

 


‎App Store: язык программирования на ассемблере

Описание

Классический язык программирования на ассемблере для iPad, iPhone и iPod touch. Язык программирования — идеальный инструмент для учебы, сложных математических расчетов, развлечения и многих других полезных задач. Приложение особенно полезно для изучения языка программирования Ассемблер. Вы должны купить компиляции внутри приложения. Требуется подключение к Интернету.

— отличный инструмент для программирования в AppStore.
— Ваш язык программирования для iOS потрясающий!

* ОСОБЕННОСТИ *

— Скомпилируйте и запустите вашу программу.
— Ввод текста перед запуском программы и вывод текста.
— Усовершенствованный редактор исходного кода с подсветкой синтаксиса, номерами строк, цветовыми темами и дополнительной клавиатурой.
— Справочник по языку в Интернете и несколько примеров программ.

* ОГРАНИЧЕНИЯ *

— Для компиляции и запуска программы требуется подключение к Интернету.
— Графика, сеть, файловая система и ввод в реальном времени не поддерживаются.
— Максимальное время работы программы 15 секунд.

Ищите также «Язык программирования Bash» в AppStore. Спасибо за использование приложения!

===================================

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

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

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

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

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

Ассемблеры, как правило, написать проще, чем компиляторы для языков высокого уровня, и они доступны с 1950-х годов. Современные ассемблеры, особенно для архитектур RISC, таких как SPARC или POWER, а также x86 и x86-64, оптимизируют планирование инструкций для эффективного использования конвейера ЦП.

Версия 13.0

Добавлена ​​поддержка iOS 13.

Рейтинги и обзоры

8 оценок

Компиляции недоступны

100% оплачено!

Нет бесплатных компиляций

По крайней мере, давайте проверим, хотим ли мы купить

Отличное приложение на ассемблере! Однако…

Я даю этому приложению 4 звезды только потому, что оно не поддерживает многозадачность, а это означает, что я не могу сдвинуть экран вправо, чтобы просмотреть инструкции из моего учебника по языку ассемблера Кипа Ирвина, одновременно вводя и тестируя эти команды в этот компилятор сборки. **Примечание. У меня есть компилятор C от этого же поставщика, который поддерживает многозадачность. Я заплатил за безлимитный вариант $2.99 для этого приложения ASM, с ожиданием, что оно поддерживает ту же функцию многозадачности, что и другие приложения того же поставщика. В целом, это лучший и единственный вариант, с которым я столкнулся для сборки синтаксиса Intel x86 (то есть компилятора). Отличная работа, но исправьте!!

Разработчик Анастасия Ковба не предоставила Apple подробностей о своей политике конфиденциальности и обработке данных. Для получения дополнительной информации см. политику конфиденциальности разработчика.

Сведения не предоставлены

Разработчик должен будет предоставить сведения о конфиденциальности при отправке следующего обновления приложения.

Информация

Продавец
Анастасия Ковба

Размер
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *