Разработка программы на языке Assembler с использованием процедур

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    128,2 Кб
  • Опубликовано:
    2013-06-17
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка программы на языке Assembler с использованием процедур

СОДЕРЖАНИЕ

Введение

. Постановка и формулировка задачи

1.1 Постановка задачи

.2 Назначение программы

2. Проектирование

2.1 Формирование «ассемблерной» модели задачи

.2 Разработка алгоритма реализации задачи

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

3. Кодирование

3.1 Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления

.2 Программирование задачи

4. Тестирование

Вывод

Перечень ссылок

Приложение

ВВЕДЕНИЕ

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

В процессе выполнения курсовой работы необходимо:

а)      разобраться с арифметическими процессами;

б)      разобраться с алгоритмом віполнения ассемблером определённых арифметических операций;

в)      всесторонне оценить поставленную задачу и определить оптимальные пути ее решения;

г)       составить алгоритмы для реализации работы программного обеспечения;

Программа должна быть оформлена с использованием процедур.

1. ПОСТАНОВКА И ФОРМУЛИРОВКА ЗАДАЧИ

1.1 Постановка задачи

Имеется аналитически заданная на участке  функция . Необходимо разработать на языке ассемблера программу, которая бы выполняла следующие действия:

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

         производила вычисление значений функции  для всех  значений аргумента  от  до ;

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

         выводила на экран приглашение на ввод произвольного значения аргумента  с указанием предельных допустимых значений интервала;

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

         выводила на экран консоли результат вычисления;

         выдавала запрос на повторение действий в формате «Y/N» и обрабатывала ввод пользователя;

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

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

При использовании линейной интерполяции значение функции  в точке  вычисляется с помощью следующего выражения:

.

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

Исходные данные:

При X0 = 6.3; Xn=8.4

X0 < X < X0 + 0.2l=

Y(X) X0 + 0.2l < X < X0+0.6l=

X0 + 0.6l < X < Xn=

.2 Назначение программы

Данный курсовой проект предназначен для вычисления значения функции на основе определённой формулы.

При использовании линейной интерполяции значение функции  в точке  вычисляется с помощью следующего выражения:

.

программа ассемблерный алгоритм функция

2. ПРОЕКТИРОВАНИЕ

.1 Формирование «ассемблерной» модели задачи

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

Необходимо решить это, пользуясь средствами языка ассемблера. Так как все процессы на аппаратном уровне используют только команды машинного языка то, необходимо знать архитектуру компьютера, а в частности его процессора и математического сопроцессора [1].

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

В модулях разрабатываемого приложения можно использовать модель памяти SMALL, которая используется для большинства программ на ассемблере. При этом код занимает один сегмент, а данные объединяются в одну группу [1].

Архитектура компьютеров на базе микропроцессоров вначале опиралась исключительно на целочисленную арифметику. С ростом мощи, а главное с осознанием разработчиками микропроцессорной техники того факта, что их устройства могут составить достойную конкуренцию своим «большим» предшественникам, в архитектуре компьютеров на базе микропроцессоров стали появляться устройства для обработки чисел с плавающей точкой. В архитектуре семейства микропроцессоров Intel 80x86 устройство для обработки чисел с плавающей точкой появилось в составе компьютера на базе микропроцессора i8086/88 и получило название математический сопроцессор (далее просто сопроцессор). Выбор такого названия был обусловлен тем, что, во-первых, это устройство было предназначено для расширения вычислительных возможностей основного процессора, а, во-вторых, оно было реализовано в виде отдельной микросхемы, то есть его присутствие было необязательным. Микросхема сопроцессора для микропроцессора i8086/88 имела название i8087. С появлением новых моделей микропроцессоров Intel совершенствовались и сопроцессоры, хотя их программная модель осталась практически неизменной. Как отдельные (а, соответственно, необязательные в конкретной комплектации компьютера) устройства, сопроцессоры сохранялись вплоть до модели микропроцессора i386 и имели название i287 и i387 соответственно. Начиная с модели i486, сопроцессор исполняется в одном корпусе с основным микропроцессором и, таким образом, является неотъемлемой частью компьютера.

Сопроцессор добавляет следующие возможности:

-     полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Эти стандарты описывают как форматы данных, с которыми должен работать сопроцессор, так и набор реализуемых им функций;

-        поддержка численных алгоритмов для вычисления значений тригонометрических функций;

         обработка десятичных чисел с точностью до 18 разрядов, что позволяет сопроцессору выполнять арифметические операции без округления над целыми десятичными числами со значениями до 1018;

-        обработка вещественных чисел из диапазона .

.2 Разработка алгоритма реализации задачи

Алгоритм реализации данной задачи можно представить следующим образом:

1)      Выводится запрос на введение максимального значения х.

2)      Ввод значения х в формате вещественного числа и перевод его из строкового представления в числовое.

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

)        Организовывается цикл, по которому производиться вычисление функции y=f(x), учитывая условия, и записывается результат в массив.

)        Запросить ввод значения х для вычисления функции.

)        Если введённое значение не входит в заданный ранее интервал, то снова перейти к п.5.

)        Определить значения у с помощью линейной интерполяции.

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

)        Вывести результат на экран.

)        Вывести запрос на повторение действий в формате «Y/N», если нажимаем «Y», то перейти к п.1, иначе - выйти из программы.

Составим блок-схему для данного алгоритма. Она представлена в приложении А.

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

Изначально программный код разделен на три файла: ftosymb.asm - модуль перевода вещественного числа в символьное представление, in_fl_v2.asm - модуль чтение чисел с консоли, main.asm - основной расчетный модуль.

3. КОДИРОВАНИЕ

.1 Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления

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

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

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

Ниже приведу таблицу структуры входных и выходных данных (табл.3.1).

Таблица 3.1

Модуль

Имя переменной

Значение

Формат

in_fl_v2

len_buf

0

db


len_in

0

db


buf_in

0

db


buf_end

0.0

db


NumTmp

0.5

dw


cn10

10

dd


cn48

10

dd

ftosymb

a1

0

dq


pow_dec

0

dw


i_save

0

dd


f_save

0.0

dq


c_05

0.5

dd


c_10

10

dd


i_tol

10

dw


i_part

0

dw


f_part

0

dt


flag

0

db

.6

db


p_sign

.2

db


string

20 dup

db

in_fl_v2

mes_intro

13,10

db


mes1

13,10

db


mes2

13,10

db


mes3

13,10

db


mesY

13,10

db


mes_er

13,10

db


indx

0

db


X0

6.3

dd


i1

6,72

dd


i2

7,14

dd


Xn

8.4

dd


L

2.1

dd


X

?

dd


Y

?

dd


n

?

dd


vdX

?

dd


A

101 dup (<>)

AR


3.2 Программирование задачи

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

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

В приложении А приведена ассемблерная программа, которая демонстрирует работу данного курсового проекта, работу с вещественными числами с плавающей запятой. Эта программа предназначена для вычисления значений функции y=f(x) в интервале x0 ≤ x ≤ xn , при x0 = 6.3, xn = 8.4. Алгоритм работы понятен из комментариев, которыми снабжен текст приведенной программы. Рассмотрим участки кода для вычисления Y на каждом из трех участков.

_1 proc ;

процедура расчёта Y на 1-ом участке finit

fldXa2a1_1 endp_2 proc ;процедура расчёта Y на 2-ом участке

finit

fld a1 ;Загружаем показатель степени

fld x

fld x ;Загружаем основание

fyl2x ;Стек FPU теперь содержит: ST(0)=y*log2(x)

fld st(0) ;Создаем еще одну копию z

frndint ;Округляем ST(0)=trunc(z) | ST(1)=zst(1);ST(0)=z | ST(1)=trunc(z)st(0),st(1) ;ST(0)=z-trunc(z) | ST(1)=trunc(z)xm1 ;ST(0)=2**(z-trunc(z))-1 | ST(1)=trunc(z);ST(0)=1 ST(1)=2**(z-trunc(z))-1 | ST(2)=trunc(z)st(1),st ;ST(0)=2**(z-trunc(z)) | ST(1)=trunc(z);ST(0)=(2**(z-trunc(z)))*(2**trunc(z))=2**(z)Y ;Результат_2 endp_3 proc ;процедура расчёта Y на 3-ом участке

finit a1Y_3 endp

4. ТЕСТИРОВАНИЕ

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

 (4.1)

где yист - истинное значение функции;

yп - полученное значение функции.

 - погрешность вычислений.

Таблица 4.1 - Погрешность расчетов на 1-ом интервале функции

Кол-во интервалов Полученное значение Введенное число Истинное значение Погрешность, %





33

69,50000108991350446

6,5

69,5

0,000001568

66

69,49999986394048237

6,5

69,5

0,000000196

100

69,49999913727555028

6,5

69,5

0,000001241


Рисунок 4.1 - График погрешности на 1-ом интервале

Таблица 4.2 - Погрешность расчетов на 2-ом интервале функции

Кол-во интервалов

Полученное значение

Введенное число

Истинное значение

Погрешность, %

33

0,00005949902288795802

7

0,000059499

0,000038468

66

0,00005949904968095455

7

0,000059499

0,000083499

100

0,0000595190017795587

7

0,000059499

0,033617001


Рисунок 4.2 - График погрешности на 2-ом интервале

Таблица 4.3 - Погрешность расчетов на 3-ом интервале функции

Кол-во интервалов

Полученное значение

Введенное число

Истинное значение

Погрешность, %

33

2

8

2

0

66

2

8

2

0

100

8

2

0


Рисунок 4.3 - График погрешности на 3-ом интервале

Вывод

В ходе выполнения курсовой работы были получены навыки в программировании на языке Assembler.

В процессе выполнения курсовой работы было :

а)      Исследована работа с арифметическими процессами;

б)      изучен алгоритм выполнения ассемблером определённых арифметических операций;

в)      Исследована поставленная задача и определены оптимальные пути ее решения;

г)       Составлены алгоритмы для реализации работы программного обеспечения;

Программа была реализована с использованием процедур.

ПЕРЕЧЕНЬ ССЫЛОК

1.            Юров В. Assembler: учебник.- СПБ.: «Питер», 2000.- 624 с.

2.      Юров В. Assembler: специальный справочник.- СПБ.: «Питер», 2000.- 496 с.

3.      Юров В. Assembler: практикум.- СПБ.: «Питер», 2001.- 400 с.

.        Методические указания по оформлению курсовых проектов и работ /Сост.: Ю.Э. Паэранд, П.В. Охрименко - Алчевск: ДГМИ, 2002.-50с.

ПРИЛОЖЕНИЕ А

Блок схема работы алгоритма


ПРИЛОЖЕНИЕ Б

Исходный код программы

_windowout macro _string,_count

xor ax,axah,03hbh,0 ;­®¬ ўЁ¤Ґ®бва ­Ёжл10h ;бзЁв вм Є®®а¤Ё­ вл Єгаб®а ў ah,13hal,00000001bcx,_countbl,00001011b ;colordsesbp,offset _string10h_massive macro;¬ Єа®б ¤®Ў ў«Ґ­Ёп X,Y ў ¬ ббЁў.,ax;®зЁбвЄ е,indx;ў al indx,8;ў dl 8;г¬­®¦ Ґ¬ al ­ 8, १, ў е,ax;ў si indx*8,X[si].vX,eax,Y[si].vY,eax

;-------------------------------------------------------------------------------Input_Float:FAROut_Float:FARmacro.incstruc ;бвагЄвга ¤«п еа ­Ґ­Ёп ¤ ­­ле(X,Y)dd 0dd 0endsSMALL

.586256

.data_frac equ [bp+4]

; локальные переменныеequ word ptr [bp-2]

temp equ word ptr [bp-4]_intro db 13,10,'corse work system programming variant 50',13,10_i=$-mes_introdb 13,10,'input section number (5-100): N = $'db 13,10,'repeat? ... y/n $' db 13,10,'input X from 6.3 to 8.4: X = $'db 13,10,'Y = $'_erdb 13,10,'ERROR!!! $'0 ;⥪гйЁ© Ё­¤ҐЄб ў ¬ ббЁўҐdd 6.3 ;X0dd 6.72 ;Ја ­Ёж 1-Ј® гз бвЄ dd 7.14 ;Ја ­Ёж 2-Ј® гз бвЄ 8.4 ;Xn2.1 ;¤«Ё­­ ўбҐЈ® Ё­вҐаў « dd 2.0dd 11.0? ;⥪г饥 §­ 祭ЁҐ X? ;⥪г饥 §­ 祭ЁҐ Y? ; ўбЇ®¬®Ј вҐ«м­ п ЇҐаҐ¬Ґ­­ п? ;Є®«ЁзҐбвў® гз бвЄ®ў? ;dX, а §¬Ґа гз бвЄ 101dup (<>) ;¬ ббЁў

.codeproc nearaxdxsi

; Формируем кадр стэка, чтобы хранить десятку и ещё какую-нибудь цифру.

push bpbp, sp10

push 0

; В SI признак знака.si, si

; Начнём накапливать число. Сначала это ноль.

; Вводим первый символ. Это может быть минус.ah, 01h

int 21hal, '-'

jne short @if1

; Если это действительно минус, запоминаем это

; и вводим следующую цифру.si

@if0: mov ah, 01h21h

; Если введена точка, то пора переходить

; к формированию дробной части.

@if1: cmp al, '.'short @if2

; Ну а если нет, то проверим, что ввели цифру

; (в противном случае закончим ввод),

cmp al, 39hshort @if5al, 30hshort @if5

; сохраним её во временной ячейке и допишем

; к текущему результату справа,[bp - 4], al

; то есть умножим уже имеющееся число на десятьword ptr [bp - 2]

; и прибавим только что обретённую цифру.word ptr [bp - 4]

; И так, пока не надоест.short @if0

; Если собрались вводить дробную часть,

; то запасёмся единицей.

@if2: fld1

; Вводим нечто.

@if3: mov ah, 01h21h

; Если это не цифра, сдаёмся.

cmp al, 39hshort @if4al, 30hshort @if4

; Иначе сохраняем её во временной ячейке,[bp - 4], al

; получаем очередную отрицательную степень десятки,word ptr [bp - 2]

; дублируем её,st(0)

; помножаем на введённую цифру, тем самым получая

; её на нужном месте,word ptr [bp - 4]

; и добавляем к текущему результату.st(2), st

; Опять-таки, пока не надоест.short @if3

; Если ввод дробной части закончен,

; нам больше не нужна степень десятки.

@if4: fstp st(0)

; Осталось разве только перейти на новую строку

@if5: mov ah, 02hdl, 0Dh21hdl, 0Ah21h

; и вспомнить про знак.si, si

jz short @if6

@if6: leavesidxaxendpproc near

enter 4, 0 ; пролог - выделим в кадре стека 4 байта под локальные переменныеten, 10; определяем знак числаax@positival, '-' ; если число отрицательное - выводим минус29h; и получаем модуль числа

@positiv:; загружаем единицуst(1) ; копируем число на вершину стека; выделим дробную частьst(2), st ; отнимем ее от числа - получим целую частьst(2) ; меняем местами целую и дробную частиcx, cx ; обнуляем счетчик

; далее идет стандартный алгоритм вывода целого числа на экран

@1:ten ; делим целую часть на десятьst(1) ; обменяем местами st и st(1) для команды fpremst(1) ; копируем результат на вершину стека ; выделим дробную часть (цифру справа от целой части)st(2), st ; получим целую частьten ; *10temp ; получаем очередную цифру temp ; заталкиваем ее глубже в стекcx ; и увеличим счетчикst(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1); проверим не получили ли в частном 0?ax@1 ; нет - продолжим цикл

@2: ; извлекаем очередную цифру, переводим её в символ и выводим.

pop axal, '0'29h

loop @2

; далее то же самое, только для дробной части. Алгоритм похож на вывод целого числа, только вместо деления умножение и проход по числу слеваst ; сначала проверим, есть ли дробная часть

fxch st(1)ax

jz @quit ; дробная часть отсутствуетal, '.'29h ; если присутствует - выведем точкуcx, length_frac ; помещаем в счетчик длину дробной части

@3:ten ; умножим на 10st(1) ; подготовка для fprem - меняем st и st(1) местами иst(1) ; копируем число на вершину; отделим дробную часть от целойst(2), st ; и оставляем дробнуюst(2)temp ; выталкиваем полученное число из стека в tempax, temp ; по дробной части идем слева, значит число выводим сразу, без предварительного сохранения в стекal, 30h ; перевод в ascii29h ; на экранst(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1)ax; проверим на 0 остаток дробной части@3

@quit:; готово. Чистим стек сопроцессора

fstp st; эпилог2endp_1 proc ;Їа®жҐ¤га а бзсв Y ­ 1-®¬ гз бвЄҐ a2a1_1 endp_2 proc ;Їа®жҐ¤га а бзсв Y ­ 2-®¬ гз бвЄҐ

finit a1 ;Загружаем показатель степениxx ;Загружаем основаниеx ;Стек FPU теперь содержит: ST(0)=y*log2(x)st(0) ;Создаем еще одну копию z

frndint ;Округляем ST(0)=trunc(z) | ST(1)=zst(1);ST(0)=z | ST(1)=trunc(z)st(0),st(1) ;ST(0)=z-trunc(z) | ST(1)=trunc(z)xm1 ;ST(0)=2**(z-trunc(z))-1 | ST(1)=trunc(z);ST(0)=1 ST(1)=2**(z-trunc(z))-1 | ST(2)=trunc(z)st(1),st ;ST(0)=2**(z-trunc(z)) | ST(1)=trunc(z);ST(0)=(2**(z-trunc(z)))*(2**trunc(z))=2**(z)Y ;Результат_2 endp_3 proc ;Їа®жҐ¤га а бзсв Y ­ 3-®¬ гз бвЄҐ a1Y_3 endp_X proc

finit

fld X

fadd vdX

fstp X_X endp:ax,@datads,ax

_windowout mes_intro,len_i

;------------------------- ­ з «® ®б­®ў­®© Їа®Ја ¬¬л ----------------------------_Str mes1 ;ўлў®¤ ЇаЁ« 襭Ёп ­ ўў®¤Input_Float ;ўў®¤ nn ;б®еа ­пҐ¬ n Є Є 楫®Ґn,5 ;Їа®ўҐаЄ ўўҐ¤с­­®Ј® зЁбer ;®Є®­з ­ЁҐ Їа®Ја ¬¬л Ґб«Ё n < 5n,100 ;Їа®ўҐаЄ ўўҐ¤с­­®Ј® зЁбer ;®Є®­з ­ЁҐ Їа®Ја ¬¬л Ґб«Ё n > 100indx,0 ;indx=0;Ё­Ёж. FPULnvdX ;Ї®«гз Ґ¬ dXedx,X0 ;гбв ­®ўЄ ­ з. §­XX,edx ;_1:Calc_1 ;ўлзЁб«пҐ¬ Y ­ 1-ў®¬ гз бвЄҐ

;SPIKE1

; mov eax,X ;

;cmp eax,i1 ;ба ў­Ґ­ЁҐ

;jl interval_2 ;xi1axinterval_2_massive ;§ ­®бЁ¬ ¤ ­­лҐ ў ¬ ббЁўnext_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ §­ з. Xinterval_1 ;ўлз. б«Ґ¤. §­. Y ў н⮬ Ё­вҐаў «Ґ_2:Calc_2 ;ўлзЁб«пҐ¬ Y ­ 2-®¬ гз бвЄҐxi2axinterval_3_massive ;§ ­®бЁ¬ ¤ ­­лҐ ў ¬ ббЁўnext_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ §­ з. Xinterval_2 ;ўлз. б«Ґ¤. §­. ў н⮬ Ё­вҐаў «Ґ_3:Calc_3 ;ўлзЁб«пҐ¬ Y ­ 3-ў®¬ гз бвЄҐxXnaxinter_massive ;§ ­®бЁ¬ ¤ ­­лҐ ў ¬ ббЁўnext_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ §­ з.Xinterval_3 ;ўлз. б«Ґ¤. §­. ў н⮬ Ё­вҐаў «Ґ:_Str mes3infloatxX0axerxXnaxerindx,0_loop1: ;Ї®ЁбЄ ў ¬ ббЁўҐ ўв®а®© в®зЄЁ ¤«п Ё­вҐаЇ®«пжЁЁ,ax ;®зЁбвЄ е,indx ;ў al indx,8 ;ў dl 8;г¬­®¦ Ґ¬ al ­ 8, १, ў е,ax ;ў si indx*8indxA[si].vXXaxm_loop1;Ё­вҐаЇ®«пжЁп y(x)~=Y1+((Y2-Y1)/(X2-X1))*(X-X1)[si].vX[si-8].vX;ST(0)=X2-X1[si].vYA[si-8].vY ;ST(0)=Y2-Y1,ST(1)=X2-X1ST(0),ST(1) ;ST(0)=(Y2-Y1)/(X2-X1)XA[si-8].vXA[si-8].vY ;ў ST(0) १г«мв в_Str mesYOutFloat:;------------------ ®Є®­з ­ЁҐ -----------------------------------------_Str mes2_Charal,'y'interal,'Y'interal,'N'exital,'n'ENDPROG:ax,4c00h21h:_Str mes_er_Charax,4c01h21h

end start

Похожие работы на - Разработка программы на языке Assembler с использованием процедур

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!