.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
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
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 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 ПЗ |
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
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.
Следующим появится новый запрос: «Введите 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 ПЗ |
Далее в эмуляторе 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 ПЗ |