Программирование на машинно-ориентированном языке
Курсовая
работа
Программирование
на машинно-ориентированном языке
Оглавление
Введение
. Системный
анализ
. Структурное
программирования. Схема алгоритма. Программа на языке Си для 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(!) папке).
Далее в эмуляторе DOSBox 0.74 вводим "tasm.exe <название
файла>..asm". Таким образом мы даем команду скомпилировать код и
показать ошибки, если они есть. Если их нет, то эмулятор выведет отсутствие
сообщений об ошибке и предупреждений (смотреть рис. 2). В результате удачной
компиляции будет создан файл формата *.obj.
Рис. 2
Продолжаем вводить в окно эмулятора DOSBox 0.74 команды. Вводим
"tlink.exe <название файла>.obj". Этой командой мы создаем
приложение, которое далее будет считать наше выражение. Если все прошло удачно,
то DOSBox 0.74 выдаст об этом сообщение (смотреть рис. 2). В результате будет
создан файл формата *.exe.
Последний этап трансляции. Вводим "<название файла>.exe".
В окне DOSBox 0.74 появится приглашение ко вводу, вводим значения переменных и
массива, которые могут быть целыми положительными или отрицательными числам, в
следующей последовательности: а, c, d[0], d[1], d[2], d[3]. Между каждым
введенным значением жмем Enter.
Последняя появившаяся строка - ответ, который будет целым положительным
или отрицательным числом.
6. Параметры
программы
Язык программирования Си (int)
Объем папки со всеми файлами, созданными при компиляции = 14 Мб
Объем документа с кодом = 962 байт
Средняя продолжительность компиляции = 2.5 сек
Время расчета ответа = крайне мало, менее 1 сек
Язык программирования Си ( float)
Объем папки со всеми файлами, созданными при компиляции = 14 Мб
Объем документа с кодом =1003 байта
Средняя продолжительность компиляции = 1.52 сек
Время расчета ответа = крайне мало, менее 1 сек
Язык программирования Ассемблер УМ
Объем документа с кодом =664 байт
Среднее время компиляции и расчета ответа = 15 сек.
Язык программирования Ассемблер IBM PC
Объем папки со всеми файлами, необходимыми и созданными при компиляции =
203 142 байт
Объем документа *.asm = 6 594 байт
Объем документа *.obj = 707 байт
Объем документа *.exe =924 байт
Средняя продолжительность компиляции = крайне мало, менее 1 сек
Время расчета ответа = крайне мало, менее 1 сек
Заключение
В ходе выполнения проекта, мы работали с тремя языками программирования:
Си, языком Ассемблера для Учебной Машины и языком Ассемблера IBM PC на базе
архитектуры Intel 8086.
В ходе проекта были изучены некоторые аспекты языка Ассемблера и ЭВМ в
целом. Для того, чтобы решить поставленную задачу, были продуманы алгоритмы ее
решения на языках программирования Си, Ассемблер УМ и Ассемблер IBM PC,
составлены блок-схемы этих решений и написаны программы на каждом из языков
программирования. В результаты были получены рабочие программы, которые
способны решить поставленную задачу, и примеры их работы.
Думаю, что для расширений возможностей данных программ можно попробовать
написать программу на языке Си со вставкой на языке Ассемблера, что позволит
сократить некоторое количество времени при написании и отладке программы только
на языке Ассемблера IBM PC.
Список
использованной литературы
1. Галисеев
Г.В. Ассемблер для Win 32. Самоучитель. - М.: Диалектика, 2007. - 368 с. - ISBN
978-5-8459-1197-1
. Зубков С.В.
Ассемблер для DOS, Windows и UNIX. - М. ДМК Пресс; СПб. Питер, 2006. - 608 с. -
ISBN 5-94074-259-9
. Калашников
О.А. Ассемблер? Это просто! Учимся программировать. - СПб.: БХВ-Петербург,
2007. - 384 с. - ISBN 978-5-94157-709