Курсовая работа (т): Программирование на машинно-ориентированном языке

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Программирование на машинно-ориентированном языке















Курсовая работа

Программирование на машинно-ориентированном языке

Оглавление

Введение

. Системный анализ

. Структурное программирования. Схема алгоритма. Программа на языке Си для int, float

3. Программирование

.1 Программа на Ассемблере УМ

.2 Подпрограмма ввода и вывода целых чисел на Ассемблере IBM

.3 Программа на языке программирования Ассемблер IBM РС

. Тестирование и отладка

. Инструкция пользователя

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

Заключение

Список использованной литературы

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

Введение

Язык ассе́мблера (англ. assembly language) - машинно-ориентированный язык низкого уровня с командами, обычно соответствующими командам машины, который может обеспечить дополнительные возможности вроде макрокоманд [1]; автокод, расширенный конструкциями языков программирования высокого уровня, такими как выражения, макрокоманды, средства обеспечения модульности программ [2].

Автокод - язык программирования, предложения которого по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка [2].

Язык ассемблера - система обозначений, используемая для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления) [3].

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

Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи - мнемокоды - команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора [4].

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

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

Каждая модель (или семейство) процессоров имеет свой набор - систему - команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера - Intel-синтаксис и AT&T-синтаксис.

Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Форт, Лисп, Эль-76). Фактически, в таких компьютерах они выполняют роль языков ассемблера.

1. Системный анализ


Целью курсового проекта является закрепление полученных знаний и профессиональных навыков разработки и отладки подпрограмм на языке Ассемблера. Курсовой проект выполняется в соответствии с этапами разработки программного обеспечения: анализ и постановка задачи для решения на ЭВМ, проектирование, кодирование, отладка и тестирование разработанной программы. Проектирование ведется в соответствии с методологией структурного программирования.

Требуется рассчитать выражение (1):

(1)

Необходимо разработать программы для её вычисления на языках Си, Ассемблер УМ и Ассемблер IBM PC. С клавиатуры вводятся 2 переменные и значения массива, после выполняется расчет 2 констант 2c и (a*a+1) данной функции и расчет z. Далее выполняется вывод результата на экран монитора. Программа состоит из 4-х функций: функция ввода переменных, две функция расчета констант, функция вывода результата.

2. Структурное программирование. Схема алгоритма. Программа на языке Си для int, float


Программа на языке программирования Си для int

#include "stdafx.h"

#include <iostream>

#include <conio.h>namespace std;int N = 4;raschet(int a, int c, int d[])

{int g, k, l, z;

int Y = 0;= 2 * c;= a*a + 1;<< "g = " << "2 * " << c << " = " << g << endl;<< "k = " << a*a << " + 1" << " = " << k << endl;(int i = 1; i <= N; i++)

{l = d[i] / 4;<< i << ") " << "l[" << d[i] << "] = " << d[i] << " / 4 = " << l << endl;= (g - l) / k;<< " z[" << d[i] << "] = " << z << endl;= Y + z;<< endl;}

cout << "Y = " << Y << endl;}main()

{setlocale(LC_ALL, "Russian");

int a, c, d[N];<< "Введите a = ";>> a;<< "Введите с = ";>> c;

cout << "Введите элементы массива" << endl;

for (int i = 1; i <= N; i++)

{cout << "d[" << i << "] = ";>> d[i];}(a, c, d);

_getch();

return 0;}

Программа на языке программирования Си для float

#include "stdafx.h"

#include <iostream>

#include <conio.h>namespace std;int N = 4;raschet(float a, float c, float d[])

{float g, k, l, z;

float Y = 0;= 2 * c;= a*a + 1;<< "g = " << "2 * " << c << " = " << g << endl;<< "k = " << a*a << " + 1" << " = " << k << endl;(int i = 1; i <= N; i++)

{l = d[i] / 4;

cout << i << ") " << "l[" << d[i] << "] = " << d[i] << " / 4 = " << l << endl;= (g - l) / k;<< " z[" << d[i] << "] = " << z << endl;= Y + z;<< endl;}<< "Y = " << Y << endl;}main()

{setlocale(LC_ALL, "Russian");

float a, c, d[N];<< "Введите a = ";>> a;<< "Введите с = ";>> c;

cout << "Введите элементы массива" << endl;

for (int i = 1; i <= N; i++)

{cout << "d[" << i << "] = ";>> d[i];}(a, c, d);

_getch();

return 0;}

Блок схема



3. Программирование

.1 Программа на Ассемблере УМ

start 0cc2pc0c0comp c12artartincx,a ;i:=i+1c3a,xusllda yword 20word 2word 0word 1word 3word 4word 12word 2word 0word 20124-16resb 3resb 3resb 3lda eec1kd,xc4opokyyEx77

Блок схема


3.2 Подпрограмма ввода и вывода целых чисел на Ассемблере IBM


Подпрограмма ввода

Блок схема


Подпрограмма на языке программирования Ассемблер IBM PC

procah, 0ahdi, didx, offset buff; адрес буфера21h; принимаем строкуdl, 0ahah, 0221h

; содержимое буфераsi, offset buff+2; берем адрес начала строкиbyte ptr [si], "-"; если первый символ минусii1di, 1; устанавливаем флагsi; и пропускаем его: xor ax, axbx, 10; основание сc: mov cl, [si]; берем символ из буфераcl, 0dh; проверяем не последний ли онendin

; если символ не последний, то проверяем его

; на правильностьcl, '0'; если введен неверный символ <0ercl, '9'; если введен неверный символ >9ercl, '0'; делаем из символа числоbx ; умножаем на 10ax, cx; прибавляем к остальнымsi; указатель на следующий символii2; повторяем: mov dx, offset error; если была ошибка, то выводим сообщение об

; этом и выходимah,0921h20h; все символы из буфера обработаны число

; находится в ax: cmp di,1; если установлен флаг, тоii3ax; делаем число отрицательным: retdb "incorrect number$"db 6,7 Dup(?)endp

Подпрограмма на языке программирования Ассемблер IBM PC

Процедура вывода

OutInt proc near;=====Процедура выводаax, ax; проверяем число на знак.oi1cx, ax; eсли оно отрицательное, выведем минус и

; оставим его модульah, 02hdl, '-'21hax, cxax: xor cx, cx; количество цифр будем держать в CXbx, 10; основание сс. 10 для десятеричной и т.п.: xor dx, dxbx; делим число на основание сс, в остатке

; получается последняя цифраdx; сразу выводить её нельзя, поэтому сохраним

; её в стэкеcx

; а с частным повторяем то же самое, отделяя

; от него очереднуюax, ax; цифру справа, пока не останется ноль, что

;значит, что дальшеoi2; слева только нули

;========Вывод=========ah, 02h: pop dxdl, '0'; извлекаем очередную цифру, переводим её в

; символ и выводим21hoi3; повторим ровно столько раз, сколько цифр

; насчиталиendp

Блок схема


3.3 Программа на языке программирования Ассемблер IBM PC


.model small

.stack 200h

.datadb ?db ?db 4 dup (?,?,?,?)dw ?dw ?dw ?dw 8db '0123456789ABCDEF'db 4 DUP (20h),13,10,'$'db 'Resultat',13,10,'$'

.codeprocax, ax; Проверяем число на знак.oi1

; Если оно отрицательное, выведем

;минус и оставим его модуль.cx, axah, 02hdl, '-'21hax, cxax

; Количество цифр будем держать в CX:cx, cxbx, 10; основание сс. 10 для десятеричной и т.п.:dx,dxbx

; Делим число на основание сс.

;В остатке получается последняя цифра.

; Сразу выводить её нельзя,

;поэтому сохраним её в стэке.dxcx

; А с частным повторяем то же самое,

;отделяя от него очередную

; цифру справа, пока не останется ноль,

; что значит, что дальше слева только нули.ax, axoi2

; Теперь приступим к выводу.ah, 02h

oi3:dx

; Извлекаем очередную цифру,

;переводим её в символ и выводим.dl, '0'21h

; Повторим ровно столько раз,

;сколько цифр насчитали.oi3

retendpprocah,0ah

xor di,didx,offset buff; аддрес буфера21h; принимаем строкуdl,0ahah,0221h; выводим перевода строки

; обрабатываем содержимое буфераsi,offset buff+2; берем аддрес начала строкиbyte ptr [si],"-"; если первый символ минусii1di,1; устанавливаем флагsi; и пропускаем его:ax,axbx,10; основание сc:cl,[si]; берем символ из буфераcl,0dh; проверяем не последний ли онendin

; если символ не последний, то

;проверяем его на правильностьcl,'0'; если введен неверный символ <0ercl,'9'; если введен неверный символ >9ercl,'0'; делаем из символа числоbx; умножаем на 10ax,cx; прибавляем к остальнымsi; указатель на следующий символii2; повторяем:; если была ошибка, то выводим

;сообщение об этом и выходим

mov dx, offset errorah,0921h20h

; все символы из буфера

;обработаны число находится в ax:di,1; если установлен флаг, тоii3ax; делаем число отрицательным:db "incorrect number$"db 6,7 Dup(?)endpproc near ;---------------------eAl,2BL,cBLe,AXAX,0BX,06 ;???

PP1 endpproc near ;f

mov AX,0AL,aALDX, 1AX, DXf, AXAX,0DX,06;???endp:ax, @Datads, axInputInt; ввод числа аa,ALInputInt; ввод числа сc,ALSI,0SI: call InputIntSId[SI], ALSI,2SI,tSIl1

call PP1 ;вызов п\п 1

call PP2 ;вызов п\п 2SI,0CX,4AX,AXy,AX: mov DX,0AH,0CL,0AL,d[SI]

mov BL, ALAX,0m2CL,1AL, BL

neg AL: mov DL,4DL

cbwCL,0m3AL: mov BX, e

sub BX,AX

cbwAX,BX

mov AX, BXBX,f

idiv BX;AL=AL/fBX,AXAX, BX

cwdDX,yAX, DXy, AXSI,2SI,tforCX,0

mov AX, yDX, AX;DX:=AX

call OutIntAX,4c00h21hbegin

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

Блок схема





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


Входные данные

Си Int (десятичная СС)

Си float (десятичная СС)

Ассемблер IBM PC (десятичная СС)

a = 2 c = 20 d[0] = 20 d[1] = 12 d[2] = 4 d[3] = -16

  29

  31

  1D

  29

a = 3 c = 30 d[0] = 51 d[1] = 41 d[2] = 24 d[3] = -21

  20

  21.625

  14

  20

a = 2 c = 20 d[0] = 20 d[1] = 14 d[2] = 4 d[3] = 16

  28

  29.3

  1C

  28


Переведем результат работы Ассемблера УМ в десятичную СС:

D = 29

= 20

C = 28.

Явно видим, что результат работы программ на Си (для int), Ассемблер УМ и Ассемблер IBM PC совпадают на 100%. Результат работы программ на Си (для float) немного отличается ввиду точности вычислений и отличается от округленного значения максимум на 2 единицы.


5. Инструкция пользователя


Язык программирования Си (для int) окно с запросом: "Введите а:". Необходимо ввести нужное значение переменной "а", она может быть любым целым положительным или отрицательным числом. Нажимаем Enter.

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

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

В конечном итоге в этом диалоговом окне у нас появится запись "y=…". Вместо многоточия будет стоять число-ответ, которое получилось в результате подстановки в выражение (1) введенные Вами значений "а", "с" и значений массива "d[0]", "d[1]", "d[2]", "d[3]". Ответ будет целым положительным или отрицательным числом.

Язык программирования Си (для float)

При запуске программы на языке программирования Си, появится диалоговое окно с запросом: "Введите а:". Необходимо ввести нужное значение переменной "а", она может быть любым целым или десятичным положительным или отрицательным числом. Нажимаем Enter.

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

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

В конечном итоге в этом диалоговом окне у нас появится запись "y=…". Вместо многоточия будет стоять число-ответ, которое получилось в результате подстановки в выражение (1) введенные Вами значений "а", "с" и значений массива "d[0]", "d[1]", "d[2]", "d[3]". Ответ будет целым или десятичным положительным или отрицательным числом.

Рис. 1

Язык программирования Ассемблер УМ

Записываем код программы при помощи стандартного приложения "Блокнот" в формате *.txt. При описании данных мы сразу должны задать значения для переменных "а", "с" и сразу задать значения массива, которые имеют размер в 1 слово.

Открываем этот файл в программе TCom.exe при помощи вкладки "Asm", далее в отрывшемся окне выбираем вкладку "File" затем "Open" и находим нужный файл с кодом в формате *.txt. Код программы загрузится на вкладку "Source module". Нажимаем на вкладку "GoAsm", если в коде нет ошибок, то приложение выведет синюю запись "No errors detected!" Далее загружаем модуль программы в программе..exe при помощи вкладки "Load" в основном окне.

Запускаем программу при помощи клавиши "Start" в основном окне.

Результат подстановки значений "а", "с" и массива "d" в выражение (1) будет находиться в Аккумуляторе, который располагается во втором поле программе TCom.exe (смотреть рис. 1). Значением Аккумулятора будет число в шестнадцатеричной СС.

Язык программирования Ассемблер IBM PC

Запускаем эмулятор DOSBox 0.74. С его помощью переходим на необходимый диск (используем команду "mount c", смотреть рис. 2 (файл находится на диске С в папке с название "1", название файла "сс")) и отрываем папку, в которой расположен файл с кодом программы в формате *.asm, компоновщик tasm.exe и редактор связей tlink.exe (ОБЯЗАЕЛЬНОЕ УСЛОВИЕ: все 3 файла должны быть в 1(!) папке).

Источник: https://www.bibliofond.ru/detail.aspx?id=787334