kursovik (Разработка программы на Ассемблере), страница 2
Описание файла
Документ из архива "Разработка программы на Ассемблере", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "kursovik"
Текст 2 страницы из документа "kursovik"
mov bx,a;обмен данными между ячейками памяти, в
mov a,ax;отличие от команды xchg ;
mov b,bx;нельзя mov a,b;
ENDM
Вызов этого макроса производится командой: Swap m,n
13. .MODEL - определяет размер памяти под данные и код программы.
.MODEL tiny;под программу,данные и стек отводится один общий сегмент (64 Kb).
14. PROC - определяет начало подрограммы.
Print PROC NEAR
;здесь команды подпрограммы
Print ENDP
....
call Print;вызов подпрграммы.
15. .STACK - определяет размер стека.
.STACK 200h; выделяет 512 байтов для стека.
16. .RADIX base - определяет систему счисления по умолчанию, где base - основание системы счисления: 2, 8, 10, 16.
.RADIX 8
oct = 77; oct равно 63d.
17. ; - начало комментария.
КОМАНДЫ ПЕРЕСЫЛКИ
1. MOV DST,SRC; переслать (SRC) в (DST). Здесь и далее содержимое регистра, например регистра AL будет обозначаться - (AL) или (al), а пересылка в комментарии будет обозначаться знаком <-- .
mov al,ch; (al) <-- (ch).
mov cx,dx;
mov bh,[mems];содержимое ячейки памяти с символическим адресом
mems переслать в регистр BH. Можно: mov bh,mems.
mov al,[bx];переслать в аккумулятор содержимое ячейки памяти
с адресом находящимся в регистре BX .
mov bx,OFFSET src;поместить в BX смещение адреса
ячейки памяти SRC, в текущем сегменте.
mov al,table[bx];загрузить в аккумулятор элемент таблицы байтов
с символическим адресом первого элемента table и отстоящий
от этого элемента на (bx) байтов. Другие варианты:
mov al,[table + bx] или
mov al,table + bx.
До выполнения команды mov al,[table + bx] | Регистр BX | Регистр AL | Адрес | Код |
0010 | XX | 0800 (table) | 8с | |
08xx | xx | |||
0810 | 58 |
После выполнения команды mov al,[table + bx] | Регистр BX | Регистр AL | Адрес | Код |
0010 | 58 | 0800 (table) | 8с | |
08xx | xx | |||
0810 | 58 |
2. PUSH RP; поместить на вершину стека содержимое пары регистров RP (например push bx).
3. POP RP; снять с вершины стека два байта и поместить в пару RP (например pop ax).
4. XCHG DST, SRC; поменять местами содержимое (DST) и (SRC). Оба операнда не могут быть одновременно содержимым ячеек памяти.
5. XLAT SRC; извлечь из таблицы с начальным адресом SRC байт данных имеющий номер от начала таблицы = (AL), и поместить его в AL. Адрес SRC должен находиться в регистре BX. Другой вариант: XLATB.
....
.DATA
src DB 15d,10h,00110101b,'A','B',166d
.CODE
....
mov al,2; в результате выполнения этих трех команд
mov bx,OFFSET src; в регистр AL будет загружен код
xlatb; 00110101b = 35h = 53d = ASCII'5'
6. IN ACCUM, PORT; поместить в аккумулятор AL или AX байт или слово из порта с адресом PORT. Если адрес порта <= FF то адрес порта может указываться непосредственно, если адрес порта > FF, то адрес порта указывается косвенно, через содержимое регистра DX (специальная функция регистра общего назначения).
in al,0a5h;ввести в AL байт данных из ВУ с адресом порта A5h ....
mov dx,379h;ввести в аккумулятор AL байт данных из
in al,dx;внешнего устройства с адресом порта 379h
7. OUT PORT, ACCUM; переслать из аккумулятора AL или AX байт или слово в ВУ с символическим адресом PORT.
out 0ffh,al;
....
mov dx,37Ah;переслать слово данных из AX в ВУ с адре-
out dx,ax;сом порта 37Ah
8. LEA RP,M; загрузить в регистр RP эффективный адрес (смещение) ячейки памяти с символическим адресом M.
lea di, rus; аналог этой команды - mov di, OFFSET rus.
АРИФМЕТИЧЕСКИЕ КОМАНДЫ
1. ADD DST, SRC; сложить содержимое SRC и DST и результат переслать в DST.
add al, [mem_byte]; mem_byte однобайтовая ячейка памяти
add [mem_word], dx; mem_word двухбайтовая ячейка памяти
add ch,10001010b;
2. INC DST; увеличить (DST) на 1 (инкремент (DST)).
inc si; (SI) <-- (SI) + 1.
inc count; (count) <-- (count) + 1.
3. SUB DST, SRC; вычесть (SRC) из (DST) и результат поместить в DST.
4. DEC DST; декремент (DST).
5. CMP DST, SRC; сравнить содержимое DST и SRC. Эта команда выполняет вычитание (SRC) из (DST) но разность не помещает в DST и по результату операции воздействует на флаги.
условие флаги
OF SF ZF CF
DST > SRC 0/1 0 0 0
DST = SRC 0 0 1 0
DST < SRC 0/1 1 0 1
0/1 - означает, что флаг может быть равен 0 или 1 в зависимости от значений операндов. Флаги OF и SF имеют смысл при операциях со знаковыми числами, CF для беззнаковых чисел. Флаг переполнения OF устанавливается в 1, если в результате операции сложения или вычитания значения переноса в старшиий двоичный разряд и из старшего двоичного разряда не совпадают. По другому определению OF принимает значение 1, если результат превышает диапазон представления соответствующих чисел. Пусть DST > SRC и оба являются однобайтовыми числами, тогда:
DST: 1. (+127) 2. (+127)
SRC: - (+2) - (-2)
------- -------
(+125) (OF)=0 (+129)? (OF)=1
Во втором примере результат превышает диапазон: -128 <= x < = +127. Флаг знака SF устанавливается в '1', если старший бит результата операции равен 1, т.е. при отрицательном результате. В противном случае сбрасывается. Флаг нуля ZF устанавливается в '1' при нулевом результате (!), иначе сбрасывается. Флаг переноса CF = 1, если есть перенос из старшего разряда при сложении или есть заем в младший разряд при вычитании. Иначе флаг сбрасывается. Для первого примера SF = ZF = CF = 0, для второго: SF = 1, ZF = CF = 0.
ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА
1. AND DST, SRC; поразрядное логическое "И".
mov dh, 10101100b;
and dh, 0f0h;
в результате выполнения этих двух команд содержимое DH станет равно 10100000b.
2. OR DST, SRC; поразрядное логическое "ИЛИ".
or bx,dx;если (BX)=5F0Fh,а (DX)=7777h,то после операции
;(BX)=7F7Fh.
BX | 0101 1111 0000 1111 = 5F0F |
DX | 0111 0111 0111 0111 = 7777 |
BX (результат) | 0111 1111 0111 1111 = 7F7F |
3. XOR DST, SRC; поразрядное логическое "исключающее ИЛИ".
xor al,55h;если (AL)=5ah, то после операции (AL)=0fh.
4. NOT DST; инверсия всех битов приемника.
5. TEST DST, SRC; выполняет операцию AND над операндами, но воздействует только на флаги и не изменяет самих операндов.
6. SHR DST, CNT; логический сдвиг вправо, освобождающиеся слева биты заполняются нулем, крайний правый бит выталкивается во флаг CF. Операнд DST может быть ячейкой памяти.
mov bl,10110010b;(CF) = x
shr bl,1;(BL) = 01011001,(CF) = 0
до сдвига |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
| (CF)=X |
после сдвига | 0---> | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | ------> | (CF)=0 |
mov cl,4;
shr bl,cl;(BL) = 00000101,(CF) = 1.
7. SHL DST, CNT; логический сдвиг влево.
8. RLC DST, CNT; циклический сдвиг влево через перенос
9. RRC DST, CNT;циклический сдвиг вправо через перенос
10. ROR DST, CNT;циклический сдвиг влево
11. ROL DST, CNT;циклический сдвиг вправо
КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ
1. CALL SUBR; вызов подпрограммы с адресом SUBR;
call delay;
mov ....
2. RET; возврат из подпрограммы к оператору следующему непосредственно за CALL, то есть в приведенном выше примере к MOV ..
3. JMP NAME; безусловный переход к команде с символическим адресом NAME.
jmp short name;переход к метке name, отстоящей не более
;чем на -128 или +127 байтов.
jmp near name;переход к метке name, отстоящей не более
;чем на 65535 байтов, в одном сегменте.
jmp name;аналогично jmp near name;
4. JA NAME или JNBE NAME; условный переход, если, например, в результате сравнения CMP DST, SRC приемник по абсолютной величине больше источника, то перейти к метке name.
5. JB NAME или JNAE NAME; условный переход, если, например, в результате сравнения CMP DST, SRC приемник по абсолютной величине меньше источника, то перейти к метке name (команды п4 и п5 выполняются по результатам выполнения операций над беззнаковыми числами).
6. JZ NAME или JE NAME; перейти, если результат операции влияющей на флаг нуля - нулевой (переход по "нулю").
7. JNZ NAME или JNE NAME; переход по "не нулю". (команды п6 и п7 выполняются по результатам выполнения операций над числами cо знаком ).
КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛАМИ
1. LOOP NAME; эта команда неявно уменьшает (CX) на 1 и осуществляет переход к ближней метке, если (CX) не равно 0.
....
mov cx,64h;блок операторов от метки syc до loop syc
syc: ....;будет выполнен 100 раз.
....
loop syc
2. LOOPZ NAME или LOOPE NAME кроме того осуществляет проверку ZF флага. Поэтому цикл заканчивается по условию, когда (CX) = 0 или (ZF) = 0 или и то и другое вместе. Т.о. эта команда служит для обнаружения первого ненулевого результата.
3. LOOPNZ, LOOPNE - выход из цикла по "нулю".
....
mov cx,1000d;цикл может быть завершен раньше 1000
next: .... ;прохода,если содержимое аккумулятора
.... ;станет равным 129,т.е. равным ASCII коду
cmp al,'Б';буквы Б.
loopnz next
9.3.9 КОМАНДЫ ОБРАБОТКИ СТРОК (ЦЕПОЧЕК БАЙТОВ)
1. LODSB; команда lodsb загружает байт адресованный регистром SI из сегмента данных, и увеличивает SI на 1, если перед этим была введена команда CLD (очистить флаг направления DF) и уменьшает SI на 1, если была использована команда STD (установить флаг направления).
....
.DATA
string DB 'abcdefg'
.CODE
....
cld;после выполнения этих команд в AL будет
mov si,OFFSET [string+2]; загружен ASCII код 'с'
lodsb;причем содержимое SI будет указывать на 'd'.
2. MOVSB; эта команда перемещает один байт из ячейки памяти с адресом в регистре SI в ячейку памяти с адресом в регистре DI и увеличивает (SI) и (DI) на 1. Значение SI может находиться, как в сегменте данных DS, так и в дополнительном сегменте ES. Значение DI может находиться только в дополнительном сегменте ES.
....
.DATA
msg DB 'Всё O.K.'
LEN = $ - msg;LEN равно 8
.CODE
....
cld
lea si,msg;в SI адрес источника
mov ax,0b800h;начало сегмента видеопамяти
mov es,ax;поместить в дополнительный сегмент
lea di,es:(0a0h * 3);4-я строка сверху
mov cx,LEN;LEN - количество выводимых символов
rp: movsb;переслать символ в текущую позицию экрана
inc di;перешагнуть через позицию атрибута
loop rp;повторить до исчерпания (CX)
....;строка 'Всё O.K.' будет выведена в 4-ю строку
;дисплея сверху.
3. REP ;префикс повторения команды. Например окончание предыдущей программы может быть записано в виде:
....
mov cx,LEN;несмотря на то,что массив'Всё O.K.'будет
rep movsb;скопирован в область памяти B800:(A0 * 3), на
;экран дисплея будет выведено: ВёOK. Почему?
4. CMPSB; осуществляет сравнение байта строки источника c адресом (SI) и байта строки приемника с адресом (DI): то есть производит вычитание ((SI)) - ((DI)). Не путать с командой CMP DST, SRC в которой наоборот, производится вычитание источника из приемника. Команда CMPSB неявно уменьшает (CX) на 1 и увеличивает (SI) и (DI) на 1, если (DF) = 0.
5. REPZ или REPE; префикс повторения. Выполнение команды завершается, когда (CX) = 0 или (ZF) = 0.
....
.DATA
src DB 'To be, or not to be'
dst DB 'To be ,or not to be'
len = $ - dst;len равно 19
.CODE
....
cld; (DF) = 0
push ds;совместить адреса
pop es;сегментов ds и es
mov cx,len;длину строки dst переслать в cx
lea di,dst;загрузить адрес(смещение) строки dst в DI
lea si,src
repe cmpsb;сравнивать побайтно
je equal;если все байты совпали, то перейти к метке
not cx;если нет - вычислить номер несовпадающих байт
add cx,len;
jmp notequal;
equal: ....
....
notequal: ....
В конце этого примера номер первого несовпадающего байта (CX) = 5.
КОМАНДЫ УПРАВЛЕНИЯ МИКРОПРОЦЕССОРОМ
1. CLC; сбросить флаг переноса (CF) = 0.
2. STC; установить флаг переноса (CF) = 1.
3. CMC; инвертировать флаг пнреноса.
4. CLD; очистить флаг направления (DF) = 0, в этом случае операции над строками (цепочками байтов) будут производиться от младшего адреса к старшему.
5. STD; установить флаг направления (DF) = 1,обработка цепочек байтов производится от старшего адреса к младшему.
6. STI; установить флаг прерываний (IF) = 1, разрешить прерывания от внешних устройств.
7.CLI; очистить флаг прерываний.
8. NOP; холостая операция.
КОМАНДЫ ПРЕРЫВАНИЙ
1. INT INUM; эта команда вызывает программное прерывание, то есть переход к ячейке памяти с адресом хранящимся в четырех байтах, начиная с адреса INUM * 4, где INUM = (0...255). Это 4-х байтовое число является указателем подпрограммы обработчика данного прерывания, и иначе называется вектором прерывания.Таким образом первый килобайт памяти 256 * 4 отводится под векторы прерываний.
Операции инициируемые программными прываниями определяются кодом в регистре AH, например:
....
mov ah,14d;функция вывода символа на дисплей,с последующимм
mov al,31h;продвижением курсора на одну позицию вправо.
int 10h;на экран будет выведена цифра '1'(ASCII код 31h).
....
.DATA
privet DB 'Добрый morning !','$';
.CODE
....
lea dx,privet;специальная функция регистра DX
mov ah,9;9 - функция вывода на экран дисплея
int 21h;будет выведено приветствие ....
ВЛИЯНИЕ КОМАНД НА ФЛАГИ
В таблицу включены только те инструкции, которые влияют на флаги.
"+" - обозначает, что команда влияет на флаг, "-" - не влияет, "1" - флаг устанавливается в 1, "0" - флаг устанавливается в 0 (сбрасывается), "#" - инверсия флага, "?" - не определенное значение флага, >1 - одиночный сдвиг, >n - многоразрядный сдвиг.
ПРИМЕЧАНИЯ
1. R1,R2 - одно- или двухбайтные регистры.
2. RP - двухбайтные регистры.
3. SRC,DST -источник,приемник (регистр или ячейка па-
мяти)
4. M,M1,M2 -ячейки памяти с символическими адресами M,
M1 и M2.
5. CNT - счетчик,регистр CL или CX.
6. SUBR,NAME - символический адрес (метка начала
подпрограммы или блока операторов).
7. Во всех командах условных переходов метка NAME
должна отстоять от команды перехода не более,чем на -128
или +127 байтов.
8. INUM - номер прерывания.
ОБЩИЙ РАЗДЕЛ
1.1. Технико-математическое описание задачи
Программа делится на две части:
Первая часть программы - Сбор сведений - это часть программы, собирающая справки об оборудовании, установленном на ПК, на котором программа выполняется. Справки наводятся о следующих устройствах:
-
математическом сопроцессоре;
-
СОМ портах;
-
LPT портах;
-
дисководах;
-
CD-ROM приводах;
-
расширенном управлении электропитанием;
-
манипуляторе «мышь».
Математический сопроцессор – это микрочип, устанавливаемый на материнскую плату, который работает совместно с основным процессором, осуществляет обработку чисел с плавающей точкой, тем самым разгружая основной процессор. Может устанавливаться опционально по желанию пользователя либо самим пользователем, т.е. может либо присутствовать, либо отсутствовать.
СОМ порты – это порты с последовательным типом передачи данных, предназначенные для подключения коммуникационных, манипуляторных и других устройств, где требуется сравнительно не- большая скорость передачи данных. Количество установленных последовательных портов может варьироваться от одного до четырёх. На некоторых материнских платах существует ограничение на подключение последовательных портов, например: если это значение будет два, и если вы подключите четыре порта, то работать будут все равно два.
LPT порты – это порты с параллельным типом передачи данных, предназначенные для подключения принтеров и других устройств, где требуется относительно большая скорость передачи данных, а также могут использоваться для соединения двух компьютеров между собой для обмена данными. Количество установленных LPT портов может варьироваться от одного до четырёх.
Дисковод – устройство, предназначенное для чтения/записи накопителей на магнитном диске (гибкий диск). Существует четыре типа дисководов:
-
360 Кб.;
-
720 Кб.;
-
1.2 Мб.;
-
1.44 Мб.
Они различаются по формату обслуживаемых дискет и максимально возможному объему данных, записываемых на дискету соотвестсвующего типа.
CD-ROM привод – устройство, предназначенное только для чтения накопителей на лазерных дисках. Различаются по скорости доступа к данным и скоростью вращения лазерного диска. Обычно устанавливают не более одного привода.
РУЭ (расширенное управление электропитанием) – стандарт, служащий для экономии электроэнергии. Представляет собой следующий набор функций:
-
автоматическое отключение электропитания;
-
«спящий» режим;
-
автоматическое отключение питания монитора;
-
автоматическое отключение питания жестких дисков.
Может находиться в двух состояниях: включено или выключено.
Вторая часть программы - диагностика памяти - проверяет на работоспособность память ПК, на котором выполняется программа.
1.2. Требования к функциональным характеристикам
При запуске программы на экран должна выводиться аннотация, затем, после нажатия на любую клавишу, должен очищаться экран и появляться меню из трех пунктов:
1 – сбор сведений о системе;
2 – тест памяти;
3 – выход.
Для выбора интересующего пункта необходимо нажать на клавиатуре цифры, соответствующие номерам пунктов.
В случае выбора пункта «Сбор сведений о системе» выполняется последовательный вывод информации о ПК в виде списка устройств с текущим состоянием. Ниже приведена таблица со списком устройств и их возможными состояниями.
Таблица 1
Таблица возможных состояний устройств
Устройство | Возможные состояния |
Математический сопроцессор | Присутствует, отсутствует |
Максимальное количество подключаемых Сом портов | От 0 до 4 |
Количество CОМ-портов | От 0 до 4 |
Количество LPT-портов | От 0 до 4 |
Первый дисковод | Отсутствует, 360Kb, 720Kb, 1.2Mb, 1.44Mb. |
Второй дисковод | Отсутствует, 360Kb, 720Kb, 1.2Mb, 1.44Mb. |
Количество установленных CD-ROM приводов | От 0 до 4 |
Расширенное управление электропитанием(APM) | Отсутствует, присутствует, включено/выключено |
Манипулятор «мышь» | Отсутствует, присутствует |
После вывода списка устройств, в программе необходимо реализовать задержку, затем возврат в меню.
В случае выбора пункта «тест памяти» программа должна выполнять тестирование не менее 640Кб. памяти. В случае если память исправна, на экран выводиться сообщение «тест пройден», в противном случае «тест не пройден». Также необходимо реализовать задержку и возврат в меню.
В случае выбора пункта «выход», необходимо реализовать завершение работы программы и передачу управления операционной системе DOS.
1.3. Требования техническим и программным средствам
Программа выполнена на языке ассемблера 8086 процессора,
соответственно ей необходим IBM PC – совместимый компьютер с процессором не ниже 8086, также программа может выполняться на компьютерах с процессорами старшего поколения (например: 80286 или 80386), т.к. особенностью архитектуры 80х86 является преемственность на уровне машинных команд: программы, написанные для младших моделей процессоров, без всяких изменений могут быть выполнены на более старших моделях.
Компилированный код программы занимает всего 2 Кб – это связано с отсутствием избыточного кода, которого очень много при использовании языков высокого уровня. В связи с этим программа может легко поместиться на дискету 360 Кб.
Программа работает в текстовом режиме и не использует цветовой гаммы, поэтому ей достаточно монитора CGA. Кроме того она может без всяких изменений работать на мониторах старшего поколения таких, как EGA, VGA и SVGA.
Так как программа тестирует 640 Кб оперативной памяти, этот объем является минимумом.
1.3.1. Обоснования выбора языка программирования
Для написания данной программы был выбран язык ассемблера. В связи с тем, что он наиболее подходит для реализации такого рода задач, т.е. где требуется доступ к портам, выполнение специальных прерываний, доступ к области памяти BIOS и т.д.
Язык ассемблера, представляет собой фактически символьную форму записи машинного языка: в нем вместо цифровых кодов операций вписывают привычные знаки операций или их словесные названия, вместо адресов – имена, а константы записывают в десятичное системе счисления. Программу, записанную в таком виде, вводят в ЭВМ и подают на вход специальному транслятору, называемому ассемблером, который переводит её на машинный язык, и далее полученную машинную программу выполняют.
Для любой ЭВМ можно придумать разные языки ассемблера, хотя бы потому, что можно по-разному обозначать машинные операции. В частности, и для ПК разработано несколько таких языков(ASM-86, MASM, TASM). Для реализации данной задачи был выбран язык, который создан фирмой Borland и полное название которого – турбо ассемблер, сокращенно TASM. Надо отметить, что этот язык наиболее часто используется на ПК.