Разработка программы на Ассемблере

Codes SEGMENT para ‘code’
org 100h
assume cs Codes,ds Codes,ss Codes

movcur macro
mov ah,02h
mov bh,0
int 10h
endm

print macro x
mov ah,09h
mov dx,offset x
int 21h
endm

press macro
print pressanykey
xor ax,ax
int 16h
endm

clrscr macro
mov ax,0700h
mov bx,0700h
xor cx,cx
mov dx,184fh
int 10h
endm

Begin proc far
jmp StartMe

input label byte
maxln db 2
realln db ?
inparg db ?
pressanykey db 10,13,10,13,’H ¦¬ЁвҐ «оЎго Є« ўЁиг ¤«п Їp®¤®«¦Ґ­Ёп…$’
ann db 10,13,’ ЂHHЋ’Ђ–€џ’,10,13,’ „ ­­ п Їp®Јp ¬¬ ®бгйҐбвў«пҐв ¤Ё Ј­®бвЁЄг ®Ў®p㤮ў ­Ёп ЏЉ ‘,10,13,’ — ‘Ў®p ᢥ¤Ґ­Ё© — ­ ў®¤Ёв бЇp ўЄЁ ®Ў гбв ­®ў«Ґ­­®¬ ­ ЏЉ ®Ў®p㤮ў ­ЁЁ’,10,13,’$’
ann1 db ‘ — ’Ґбв Ї ¬пвЁ — ®бгйҐбвў«пҐв Їp®ўҐpЄг Ї ¬пвЁ ­ p Ў®в®бЇ®б®Ў­®бвм’,10,13,’$’
ann2 db ‘ ђ §¤Ґ« ‘Ў®p ᢥ¤Ґ­Ё©» б®ЎЁp Ґв Ё­д®p¬ жЁо ® б«Ґ¤гойЁе гбвp®©бвў е ‘,10,13,’ — ® COM-Ї®pв е,’,10,13,’$’
ann3 db ‘ — ® ¬ в. б®Їp®жҐбб®pҐ,’,10,13,’ — ® ¤ЁбЄ®ў®¤ е,’,10,13,’ — ® LPT — Ї®pв е,’,10,13,’ — ® CD-ROM ЇpЁў®¤ е,’,10,13,’ — ® ђ биЁpҐ­­®¬ гЇp ў«Ґ­ЁЁ н«ҐЄвp®ЇЁв ­ЁҐ¬,’,10,13,’ — ® ¬ ­ЁЇг«пв®pҐ «¬лим»$’
StartMe
;*************** MAIN ROUTINE *************
clrscr
xor dx,dx
movcur
print ann
print ann1
print ann2
print ann3
press

Start
call ShowQuestion

mov ah,0Ah
mov dx,offset input
int 21h

mov al,inparg

cmp al,31h
je Sved

cmp al,32h
je TestComp

cmp al,33h
je StopProgramm
jmp Start

StopProgramm
mov ah,4ch
int 21h
Sved
call SborSved
press
jmp Start
TestComp
call TestMem
press
jmp start
Begin endp

;**************** SUBROUTINES *************

ShowQuestion proc near
jmp l1
system db ‘1 — ‘ўҐ¤Ґ­Ёп ® бЁб⥬Ґ’,10,13,’$’
tst db ‘2 — ’Ґбв Ї ¬пвЁ’,10,13,’$’
quit db ‘3 — ‚л室$’,10,13,’$’
Choice db ‘‚ и ўлЎ®p ? $’
l1
clrscr
mov dx,0418h
movcur
print system
mov dx,0518h
movcur
print tst
mov dx,0618h
movcur
print quit
mov dx,0A18h
movcur
print Choice
ret
ShowQuestion endp

SborSved proc near
jmp @@MD
MathProc db ‘Њ ⥬ вЁзҐбЄЁ© б®Їp®жҐбб®p $’
prisuts db ‘ЏpЁбгвбўгҐв’,10,13,’$’
otsuts db ‘ЋвбгвбўгҐв’,10,13,’$’
comports db ‘Њ бЄЁ¬ «м­®Ґ Є®«ЁзҐбвў® Ї®¤Є«оз Ґ¬ле COM-Ї®pв®ў $’
kolvocomports db ‘Љ®«ЁзҐбвў® Ї®¤Є«о祭­ле COM — Ї®pв®ў $’
kolvolptports db ‘Љ®«ЁзҐбвў® Ї®¤Є«о祭­ле LPT — Ї®pв®ў $’
drive1 db ‘ЏҐpўл© ¤ЁбЄ®ў®¤ $’
drive2 db ‘‚в®p®© ¤ЁбЄ®ў®¤ $’
k360 db ‘360Kb’,10,13,’$’
k720 db ‘720Kb’,10,13,’$’
m12 db ‘1.2Mb’,10,13,’$’
m144 db ‘1.44Mb’,10,13,’$’
CDROM db ‘Љ®«ЁзҐбвў® гбв ­®ў«Ґ­­ле CD-ROM ЇpЁў®¤®ў $’
APM db ‘ђ биЁpҐ­­®Ґ гЇp ў«Ґ­ЁҐ н«ҐЄвp®ЇЁв ­ЁҐ¬ (ATX) $’
APMON db ‘,ўЄ«о祭®’ ,10,13,’$’
APMOFF db ‘,ўлЄ«о祭®’,10,13,’$’
est db ‘ЏpЁбгвбвўгҐв$’
net db ‘ЋвбгвбвўгҐв$’
baks db ‘ ‘,10,13,’$’
mouse db ‘Њ ­ЁЇг«пв®p ¬лим $’
@@MD

; ‘®Їp®жҐбб®p……
clrscr
xor dx,dx
movcur
print MathProc
int 11h
mov bx,ax
and al,02h
cmp al,02h
je have
print otsuts
jmp @next
have
print Prisuts
@next
and ah,0Eh
shr ah,1
add ah,30h
mov baks[0],ah
print comports
print baks

mov cx,4
xor bl,bl
xor si,si
xor dx,dx

mov ax,0040h ; €­жЁ «Ё§ жЁп
mov es,ax ; ᥣ¬Ґ­в­®Ј® pҐЈЁбвp ES ­ ¤pҐб ®Ў« бвЁ BIOS

@@MF
mov ax,[es] [si]
cmp ax,0000h
je @@L
inc bl
@@L
inc si
inc si
loop @@MF

add bl,30h
print kolvocomports
mov baks[0],bl
print baks

;LPT — Џ®pвл…..

xor bl,bl
mov cx,3
@@@MF
mov ax,[es] [si]
cmp ax,0000h
je @@@L
inc bl
@@@L
inc si
inc si
loop @@@MF

add bl,30h
print kolvolptports
mov baks[0],bl
print baks

; „ЁбЄ®ў®¤л …..

print drive1
mov al,10h
out 70h,al
jmp $+2
in al,71h
and al,00F0h
shr al,4
cmp al,01h
je @k360
cmp al,02h
je @m12
cmp al,03h
je @k720
cmp al,04h
je @m144
print otsuts
jmp @@ST
@k360
print k360
jmp @@ST
@m12
print m12
jmp @@ST
@m144
print m144
jmp @@ST
@k720
print k720
jmp @@ST
@@ST

print drive2
mov al,10h
out 70h,al
jmp $+2
in al,71h
and al,000Fh

cmp al,01h
je @@k360
cmp al,02h
je @@m12
cmp al,03h
je @@k720
cmp al,04h
je @@m144
print otsuts
jmp @@@ST
@@k360
print k360
jmp @@@ST
@@m12
print m12
jmp @@@ST
@@m144
print m144
jmp @@@ST
@@k720
print k720
jmp @@@ST
@@@ST

; CD-ROM……..
xor bx,bx
mov ax,1500h
int 2fh
print CDROM
cmp bx,0
je @NOCD
add bx,30h
mov baks[0],bl
print baks
jmp @@JKH
@NOCD
print otsuts
@@JKH

; APM…. (Advanced Power Manager)
print APM
mov ax,5300h
xor bx,bx
int 15h
cmp ah,86h
je @@@NONE
print est
jmp @@@COOLS
@@@NONE
print net
jmp @@@PLLL
@@@COOLS
and cl,08h
cmp cl,08h
je @@@ASD
print APMON
jmp @@@PLLL
@@@ASD
print APMOFF
@@@PLLL

; Mouse….

print Mouse
xor ax,ax
int 33h
cmp ax,0FFFFh
je @QWE
print otsuts
jmp @@@Z
@QWE
print prisuts
@@@Z
ret
SborSved endp

TestMem proc near
jmp CHG
Testing db ‘’Ґбв Ї ¬пвЁ $’
proid db ‘Їp®©¤Ґ­’,10,13,’$’
no db ‘­Ґ $’
CHG
clrscr
xor dx,dx
movcur
print Testing

mov bp,cs
add bp,128

P
xor si,si
PP
mov byte ptr [bp][si],00h
cmp byte ptr [bp][si],00
jne bad
mov byte ptr [bp][si],0ffh
cmp byte ptr [bp][si],0ffh
jne bad

inc si
cmp si,0fh
jne PP

inc bp
cmp bp,0A000h
jne P
jmp good

bad
print no
print proid
jmp JK
good
print proid
JK
ret
TestMem endp

Codes Ends
end Begin

Кыргызский Государственный Национальный Университет
Институт Интеграции Международных Образовательных программ
Кыргызско-Американский Факультет Компьютерных Информационных Систем и ИНТЕРНЕТ (КАФ-ИНТЕРНЕТ)

Курсовой проект
(Организация ЭВМ)

тема
Разработка программы на Ассемблере.

Выполнили студенты группы КИС 2 – 98
Вершинин АА Исманов АА
Проверил преподаватель Кочетов ОП

Бишкек 2001

СОДЕРЖАНИЕ

ВВЕДЕНИЕ…………………………………………………………………3
АССЕМБЛЕР. ЭТАПЫ РАЗРАБОТКИ ПРОГРАММЫ…………………4
ФОРМАТ КОМАНД И ИХ КЛАССИФИКАЦИЯ ………………………….5
НЕКОТОРЫЕ ОПЕРАТОРЫ, ПРЕДОПРЕДЕЛЁННЫЕ ИМЕНА, ДИРЕКТИВЫ И КОМАНДЫ АССЕМБЛЕРА 80X86(8088) ……………..7
КОМАНДЫ ПЕРЕСЫЛКИ …………………………………………………11
АРИФМЕТИЧЕСКИЕ КОМАНДЫ ………………………………………..12
ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА ……………………14
КОМАНДЫ УПРАВЛЕНИЯ МИКРОПРОЦЕССОРОМ …………………18
ПРИМЕЧАНИЯ………………………………………………………………20
ОБЩИЙ РАЗДЕЛ…………………………………………………………21

Технико-математическое описание задачи……….………………….21
Требования к функциональным характеристикам…………………..23
Требования к техническим и программным средствам………….… 25

Обоснования выбора языка программирования……………………. 26

СПЕЦИАЛЬНЫЙ РАЗДЕЛ…………………………………………………………………. 28
2.1. Постановка задачи…………………………………………………….. 28
2.2. Описание структуры программы……………………………….…..… 30
2.3. Описание алгоритма решения задачи………………………….……….32
2.4. Отладка и тестирование……………………………………….………. 34
2.5. Инструкция к пользователю………………………………….……….. 35
2.6. Заключение о результатах проектируемой задачи………….……….. 36
ПРИЛОЖЕНИЕ 1 (Системы счисления)………………………………….. 37
ПРИЛОЖЕНИЕ 2 (Структурная схема микропроцессора)..…………….. 44
ПРИЛОЖЕНИЕ 3 (Основные положения алгебры логики)…….……….. 59

СПИСОК ЛИТЕРАТУРЫ…………………………………………….…. 30

ВВЕДЕНИЕ

В связи с появлением персональных компьютеров мгновенно вырос рынок аппаратных средств, как грибы росло число производителей, предлагающих свою продукцию. При этом, покупая то или иное аппаратное средство, производитель не может (а иногда и не хочет) дать 100% гарантию, что оно исправно.
В связи с этим также стремительно развивался и рынок программных тестирующих средств. На рынке существует огромное количество отличных диагностических программ, написанных большими корпорациями такими как Symantec inc., APS (Advanced Personal Systems), Microsoft и т.д., но все существующие диагностирующие программы написаны на языках высокого уровня, а значит не достаточно быстры и надёжны.
Автор проекта не берётся конкурировать с огромными гигантами по количеству выполняемых этими программами тестов в силу того, что это бессмысленно. Была предпринята попытка написать более надежную, быструю диагностическую программу с использованием машинно-ориентированного языка программирования – Ассемблер.

АССЕМБЛЕР. ЭТАПЫ РАЗРАБОТКИ ПРОГРАММЫ.
Язык программирования наиболее полно учитывающий особенности «родного» микропроцессора и содержащий мнемонические обозначения машинных команд называется Ассемблером. Программа, написанная на Ассемблере называется исходной программой. Далее остановимся на версии, называемой Турбо Ассемблер.
Разработка программы на Ассемблере состоит из следующих этапов

1) Составление алгоритма в виде блок-схемы или структурного описания,
2) Ввод в ЭВМ текста исходной программы PROG.ASM с помощью редактора текстов. Имя PROG может быть произвольным, а расширение ASM — обязательно,
3) Перевод (трансляция или ассемблирование) исходной программы в машинные коды с помощью транслятора TASM.EXE. На этом этапе получается промежуточный продукт PROG.OBJ (объектный код). Выявленные при этом синтаксические и орфографические ошибки исправляются повтором пп.2 и 3,
4) Преобразование с помощью программы TLINK.EXE объектного кода PROG.OBJ в выполнимый код PROG.EXE или PROG.COM.
5) Выполнение программы и ее отладка начиная с п.1, если встретились логические ошибки.

Текст программы на Ассемблере содержит следующие операции

а) команды или инструкции,
б) директивы или псевдооператоры,
в) операторы,
г) предопределенные имена.

Действия обусловленные операциями перечисленными в пп.б,в,г выполняются на этапе трансляции, т.е. являются командами Ассемблеру. Операции, называемые командами или инструкциями выполняются во время выполнения программы, т.е. являются командами микропроцессору.

ФОРМАТ КОМАНД И ИХ КЛАССИФИКАЦИЯ

Инструкция записывается на отдельной строке и включает до четырех полей, необязательные из которых выделены [ ]

[метка ]
мнемоника_команды
[операнд(ы)]
[;комментарий]

Метка или символический адрес содержит до 31 символа из букв цифр и знаков ? @ . _ $. Причем цифра не должна стоять первой, а точка, если есть должна быть первой.
Мнемоника — сокращенное обозначение кода операции (КОП) команды, например мнемоника ADD обозначает сложение (addition).
Операндами могут быть явно или неявно задаваемые двоичные наборы, над которыми производятся операции.Операнды приводятся в одной из четырех систем счисления и должны оканчиваться символом b(B), o(O), d(D), h(H) для 2, 8, 10 или 16-ной СС. К шестнадцатиричному числу добавляется слева ноль, если оно начинается с буквы.
Система команд может быть классифицирована по трем основным признакам —

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

Для МП 1810ВМ86 (8086) команда занимает от одного до шести байтов. Первым байтом команды всегда является код операции, например код команды INT XXh равен CD(HEX).
По функциональному признаку инструкции можно разбить на пять больших групп

1) команды пересылки данных,
2) арифметические команды,
3) логические команды,
4) команды переходов и
5) команды управления.

Существует пять основных способов адресации

регистровая,
непосредственная,
прямая,
косвенная и
стековая.

Большинство остальных способов адресации являются комбинациями или видоизменениями перечисленнных.
В первом случае операнд(ы) располагаются в регистрах микропроцессора (МП), например по команде MOV AX,CX пересылается содержимое CX в AX.
При непосредственной адресации операнд располагается в памяти непосредственно за КОП, инструкция MOV AL,0f5h записывает число 245(f5) в регистр AL.
В случае прямой адресации за КОП следует не сам операнд, а адрес ячейки памяти или внешнего устройства, например команда IN AL,40h вводит байт данных из внешнего устройства с адресом 40h.
Косвенная адресация отличается от регистровой тем, что в регистре хранится адрес операнда, т.е. по команде MOV AL,[BX] в аккумулятор al будет записано число из ячейки памяти с адресом, хранящимся в регистре BX.
Стековая адресация производится к операндам расположенным в области памяти, называемой стек.

НЕКОТОРЫЕ ОПЕРАТОРЫ, ПРЕДОПРЕДЕЛЁННЫЕ ИМЕНА, ДИРЕКТИВЫ И КОМАНДЫ АССЕМБЛЕРА 80X86(8088)

ПРЕДОПРЕДЕЛЕННЫЕ ИМЕНА
1. $ — программный счетчик. Этот символ отмечает текущий адрес в текущем сегменте. Полезен при определении длины цепочек байтов или строк.

text DB ‘This string has NN letters’
NN = $ — text; NN = длине строки text (количеству байтов
в этой строке). Не путать часть строки ‘..NN..’ и константу NN!
2. @data — адрес начала сегмента данных.
….
mov ax,@data
mov ds,ax;
в сегментном регистре DS теперь адрес сегмента данных.
3. ??date, ??time, ??filename — эти имена во время трансляции заменяются, соответственно на текущие дату, время и имя файла в формате ASCII.

ОПЕРАТОРЫ

1. () — скобки, определяют порядок вычислений
2. [] — например [BX] означает содержимое ячейки памяти с адресом в регистре bx. Признак косвенной адресации.
3. +, -, *, / — операторы сложения, вычитания, умножения и деления.
mov ax, (2 * 3 + 8 / 2) — 2; в регистр ax будет помещено число 8.
4. MOD — деление по модулю. Даёт остаток.
5. SHL,SHR — сдвиг операнда влево, вправо.
mov si, 01010101b SHR 3; в регистр SI будет загружено число 0Ah (00001010).
6. NOT — побитовая инверсия.
7. AND,OR,XOR — операции «И»