Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




.model small

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 

.stack 200h

.data

 

a db?

c db?

d db 4 dup (?,?,?,?)

 

e dw?

f dw?

y dw?

t dw 8

 

D16 db '0123456789ABCDEF'

BUF db 4 DUP (20h),13,10,'$'

str1 db 'Resultat',13,10,'$'

 

.code

 

OutInt proc

 

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

jns oi1

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

;минус и оставим его модуль.

mov cx, ax

mov ah, 02h

mov dl, '-'

int 21h

mov ax, cx

neg ax

; Количество цифр будем держать в CX

oi1:

xor cx, cx

mov bx, 10; основание сс. 10 для десятеричной и т.п.

oi2:

xor dx,dx

div bx

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

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

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

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

push dx

inc cx

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

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

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

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

test ax, ax

jnz oi2

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

 

 

ВЛГУ. 230100.7.1.00 ПЗ


mov ah, 02h

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
oi3:

pop dx

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

;переводим её в символ и выводим.

add dl, '0'

int 21h

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

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

loop oi3

 

ret

 

OutInt endp

 

InputInt proc

 

mov ah,0ah

xor di,di

mov dx,offset buff; аддрес буфера

int 21h; принимаем строку

mov dl,0ah

mov ah,02

int 21h; выводим перевода строки

; обрабатываем содержимое буфера

mov si,offset buff+2; берем аддрес начала строки

cmp byte ptr [si],"-"; если первый символ минус

jnz ii1

mov di,1; устанавливаем флаг

inc si; и пропускаем его

ii1:

xor ax,ax

mov bx,10; основание сc

ii2:

mov cl,[si]; берем символ из буфера

cmp cl,0dh; проверяем не последний ли он

jz endin

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

;проверяем его на правильность

cmp cl,'0'; если введен неверный символ <0

jl er

cmp cl,'9'; если введен неверный символ >9

ja er

 

sub cl,'0'; делаем из символа число

mul bx; умножаем на 10

add ax,cx; прибавляем к остальным

inc si; указатель на следующий символ

jmp ii2; повторяем

 

 

ВЛГУ. 230100.7.1.00 ПЗ


er:; если была ошибка, то выводим

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

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
mov dx, offset error

mov ah,09

int 21h

int 20h

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

;обработаны число находится в ax

endin:

cmp di,1; если установлен флаг, то

jnz ii3

neg ax; делаем число отрицательным

ii3:

ret

 

error db "incorrect number$"

buff db 6,7 Dup(?)

InputInt endp

 

 

PP1 proc near;---------------------e

mov Al,2

mov BL,c

imul BL

cbw

mov e,AX

cwd

mov AX,0

mov BX,0

ret 6;???

 

PP1 endp

 

PP2 proc near;f

mov AX,0

mov AL,a

imul AL

cbw

mov DX, 1

add AX, DX

cbw

mov f, AX

cwd

mov AX,0

mov DX,0

ret 6;???

PP2 endp

 

Begin:

mov ax, @Data

mov ds, ax

 

ВЛГУ. 230100.7.1.00 ПЗ


Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
call InputInt; ввод числа а

mov a,AL

call InputInt; ввод числа с

mov c,AL

 

mov SI,0

push SI

 

l1: call InputInt

pop SI

mov d[SI], AL

add SI,2

cmp SI,t

push SI

jne l1

 

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

call PP2;вызов п\п 2

mov SI,0

mov CX,4

xor AX,AX

mov y,AX

for: mov DX,0

mov AH,0

mov CL,0

mov AL,d[SI]

mov BL, AL

cbw

cmp AX,0

jg m2

mov CL,1

mov AL, BL

neg AL

cbw

m2: mov DL,4

idiv DL

cbw

cmp CL,0

je m3

neg AL

cbw

m3: mov BX, e

sub BX,AX

cbw

mov AX,BX

cwd

mov AX, BX

cwd

mov BX,f

idiv BX;AL=AL/f

 

 

ВЛГУ. 230100.7.1.00 ПЗ


cbw

mov BX,AX

cwd

mov AX, BX

cwd

mov DX,y

add AX, DX

cbw

mov y, AX

add SI,2

cmp SI,t

jne for

mov CX,0

 

mov AX, y

 

mov DX, AX;DX:=AX

 

call OutInt

 

 

mov AX,4c00h

int 21h

END begin

 

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

Блок схема

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 

 

 

 

ВЛГУ. 230100.7.1.00 ПЗ

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
ВЛГУ. 230100.7.1.00 ПЗ

 


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

Входные данные Си Int (десятичная СС) Си float (десятичная СС) Ассемблер УМ (шестнадцатеричная СС) Ассемблер IBM PC (десятичная СС)
a = 2 c = 20 d[0] = 20 d[1] = 12 d[2] = 4 d[3] = -16             1D    
a = 3 c = 30 d[0] = 51 d[1] = 41 d[2] = 24 d[3] = -21       21.625    
a = 2 c = 20 d[0] = 20 d[1] = 14 d[2] = 4 d[3] = 16       29.3     1C    

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 

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

1D = 29

14 = 20

1C = 28.

ВЛГУ. 230100.7.1.00 ПЗ


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

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

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

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
окно с запросом: «Введите а:». Необходимо ввести нужное значение переменной «а», она может быть любым целым положительным или отрицательным числом. Нажимаем Enter.

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

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

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

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

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

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

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

ВЛГУ. 230100.7.1.00 ПЗ


положительными или отрицательными значениями. После каждого введенного числа нажимаем 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!» Далее загружаем модуль программы в программе.

TCom.exe при помощи вкладки «Load» в основном окне.

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

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

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

Запускаем эмулятор DOSBox 0.74. С его помощью переходим на необходимый диск (используем команду «mount c», смотреть рис. 2 (файл находится на диске С в папке с название «1», название файла «сс»)) и отрываем папку, в которой расположен файл с кодом программы в формате *.asm,

 

 

ВЛГУ. 230100.7.1.00 ПЗ

 


ВЛГУ. 230100.7.1.00 ПЗ
ВЛГУ. 230100.7.1.00 ПЗ
компоновщик tasm.exe и редактор связей tlink.exe (ОБЯЗАЕЛЬНОЕ УСЛОВИЕ: все 3 файла должны быть в 1(!) папке).

Далее в эмуляторе DOSBox 0.74 вводим «tasm.exe <название файла>..asm». Таким образом

Рис.2 мы даем команду скомпилировать код и показать ошибки, если они есть. Если их нет, то эмулятор выведет отсутствие сообщений об ошибке и предупреждений (смотреть рис. 2). В результате удачной компиляции будет создан файл формата *.obj.

Продолжаем вводить в окно эмулятора 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.

Последняя появившаяся строка – ответ, который будет целым положительным или отрицательным числом.

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
ВЛГУ. 230100.7.1.00 ПЗ

 


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

Язык программирования Си ( 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 сек

 

 

ВЛГУ. 230100.7.1.00 ПЗ


Заключение

В ходе выполнения проекта, мы работали с тремя языками программирования: Си, языком Ассемблера для Учебной Машины и языком Ассемблера IBM PC на базе архитектуры Intel 8086.

В ходе проекта были изучены некоторые аспекты языка Ассемблера и ЭВМ в целом. Для того, чтобы решить поставленную задачу, были продуманы алгоритмы ее решения на языках программирования Си, Ассемблер УМ и Ассемблер IBM PC, составлены блок-схемы этих решений и написаны программы на каждом из языков программирования. В результаты были получены рабочие программы, которые способны решить поставленную задачу, и примеры их работы.

Думаю, что для расширений возможностей данных программ можно попробовать написать программу на языке Си со вставкой на языке Ассемблера, что позволит сократить некоторое количество времени при написании и отладке программы только на языке Ассемблера IBM PC.

 

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
ВЛГУ. 230100.7.1.00 ПЗ

 

 


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

 

1. Галисеев Г. В. Ассемблер для Win 32. Самоучитель. — М.: Диалектика, 2007. — 368 с. — ISBN 978-5-8459-1197-1

2. Зубков С. В. Ассемблер для DOS, Windows и UNIX. — М. ДМК Пресс; СПб. Питер, 2006. — 608 с. — ISBN 5-94074-259-9

3. Кип Ирвин. Язык ассемблера для процессоров Intel = Assembly Language for Intel-Based Computers. — М.: Вильямс, 2005. — 912 с. — ISBN 0-13-091013-9

4. Калашников О. А. Ассемблер? Это просто! Учимся программировать. — СПб.: БХВ-Петербург, 2007. — 384 с. — ISBN 978-5-94157-709-

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
ВЛГУ. 230100.7.1.00 ПЗ

 





Поделиться с друзьями:


Дата добавления: 2016-11-12; Мы поможем в написании ваших работ!; просмотров: 331 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Так просто быть добрым - нужно только представить себя на месте другого человека прежде, чем начать его судить. © Марлен Дитрих
==> читать все изречения...

2443 - | 2199 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.