Программа на языке программирования Ассемблер 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 ПЗ