- •1. Лабораторная работа № 1
- •1.1. Общие методические указания по выполнению лабораторной работы
- •1.2. Теоретические сведения
- •1.2.1. Работа с данными на битовом уровне
- •1.2.2. Упакованные данные
- •1.2.3.Разработка менеджера памяти на основе битовой карты
- •1.3.Задание на лабораторную работу
- •1.4. Отчет по лабораторной работе
- •2. Лабораторная работа №2
- •2.1. Общие методические указания по выполнению лабораторной работы
- •2.2. Теоретические сведения
- •2.2.1. Определение данных
- •2.2.2. Команды пересылки
- •2.2.3. Арифметические операции
- •2.3. Примеры программ на ассемблере
- •2.4. Порядок выполнения работы
- •2.5. Задание на лабораторную работу
- •2.6. Отчет по лабораторной работе
2.3. Примеры программ на ассемблере
Пример 1. Программа выводит на экран три символа ‘*’, выдает приветствие и издает три звуковых сигнала. Данный пример демонстрирует структуру программы, дает образец правильного оформления программы на ассемблере.
; Сегмент стека
S SEGMENT STACK ; начало сегмента
DW 64 DUP(0ABCDh) ; Минимальный стек
;(64 слова, 80h байт). Требуется для работы
;системы прерываний
S ENDS ; Окончание сегмента
; Сегмент данных
D SEGMENT ; Начало сегмента
N equ 6 ; Задание константы с помощью
;директивы эквивалентности
X DB N DUP(4) ; Резервирование N байт памяти, ;инициализированных числом 4. ;Первый байт имеет имя X, второй ;X+1 и т.д.
Y db 'Hello, dear friend!!!',0Dh, 0Ah,'$'
; Задание константы-строки. В конце строки - символы CR
; и NL, а также признак конца строки при выводе ее на
; экран по функции №9 прерывания 21h.
Z DW N DUP(6B0Dh) ; N слов, инициализированных ;значением 6B0Dh
D ENDS ; Конец сегмента
; Сегмент кода
C SEGMENT
ASSUME SS:S,CS:C, DS:D
; Директива устанавливает соответствие между
; сегментами и сегментными регистрами. Может
; располагаться в любом месте, но до первого
; исполняемого оператора (обычно помещают в начале
; кодового сегмента)
MMM PROC FAR ; код оформляется как
; процедура, которую будет
; вызывать DOS
; Выполнение соглашений DOS
PUSH DS ;Запись содержимое DS в стек,
; т.к. в него будут загружены свои данные
SUB AX,AX ; Обнуление регистра AX
PUSH AX ; Запись ноля в стек
; установка верного значения в регистре DS (адреса
;сегмента данных). Регистры CS и SS устанавливаются
; системой.
MOV AX,D
MOV DS,AX
; непосредственно сама программа
; вывод на экран 3 звездочек (посимвольно, функция №2) ; и переход на следующую строку
MOV AH, 2 ; размещение в AH номера функции
прерывания (02 -- вывод символа на экран)
MOV DL,'*' ; размещение в DL выводимого символа
INT 21H ; вызов прерывания номер 21h
INT 21H
INT 21H
MOV DL, 0DH ; CR
INT 21H
MOV DL,0AH ; LF
INT 21H
; Выдача звукового сигнала (3 раза). Выводится как
обычный символ
MOV DL,07H ; размещение кода звукового
; сигнала в регистре данных
INT 21H
INT 21H
INT 21H
; Вывод строки-приветствия с помощью функции вывода
; строки (№9)
; Признаком конца строки является знак $
; Смещение начала строки передается через регистр
; данных DX
MOV AH,9 ; размещение номера функции прерывания
; в AH
MOV DX, OFFSET Y ; размещение в DX смещения
; строки Y относительно
; начала сегмента
INT 21H ; Прерывание
; Возврат в DOS и окончание работы программы
RET ;Возврат в DOS
MMM ENDP ;Конец процедуры MMM
C ENDS ;Конец сегмента
END MMM ;Конец программы.
Пример 2. Программа для иллюстрации различных способов пересылки данных.
; Сегмент стека
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
; Сегмент данных
D SEGMENT
X DB 0Bh ; 1 байт 0Bh
XX DB 3 dup (0CBh) ; 3 байта 0CBh
Y DW 06AB7h
Z DD 0FAFBFEFFh
YYY DD 0FFFFFFFFh
N DB 168
M DB ? ; неинициализированный байт
MM DW 10 dup (?) ; 10 неинициализированных слов
MMW DW 10 dup (0FFFFh) ; 10 инициализированных слов
MMB DB 10 dup (0CCh) ; 10 инициализированных байт
digits DB '0123456789' ; строка с цифрами
D ENDS
; Сегмент кода
C SEGMENT
ASSUME SS:S,CS:C,DS:D
START PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D
MOV DS,AX ;
; операции пересылки (MOV)
; Пересылка непосредственного операнда:
; в регистр (размер пересылаемого задает первый операнд)
MOV AX, 0234h ; слово
;MOV BL, 600 ошибочная операция – выдает
;сообщение "error A2050: Value out of range" число 600
;занимает места больше чем байт
MOV DL, 17 ; байт
MOV CH, 34 ; байт
MOV SI, 234 ; слово
;MOV DS, 234 ошибочная операция в регистр
;DS загружен адрес сегмента данных
; Пересылка непосредственного операнда:
; в память (размер пересылаемого задает первый операнд)
MOV X, 34h ; байт
MOV MM, 1722h ; слово
MOV MM+3, 34CCh ; слово со смещением 3 байта
; от начала переменной
MOV MMW+2, 0 ; слово со смещением 2 байта
от начала переменной
MOV MMW+4, 0 ; слово со смещением 4 байта
от начала переменной
MOV MMB, 0 ; байт
MOV MMB+2, 0 ; байт со смещением 2 байта от начала переменной
; Пересылка из регистра:
; в регистр (размеры операндов должны совпадать)
MOV DI, SI ; слово
MOV DH, DL ; байт
MOV ES, SI ; слово
; MOV CS, SI ошибка – в CS находится адрес сегмента
; кода
MOV X, DH ; байт
MOV MM, DS ; слово
MOV MM+4, AX ; слово со смещением 4 байта от начала переменной
; Пересылка из памяти:
; только в регистр (размеры операндов должны совпадать)
MOV DI, MM ; слово
MOV DH, X+1 ; байт
MOV ES, MM+2 ; слово
; Примеры использования оператора PTR
MOV AX, WORD PTR X
MOV BL, BYTE PTR MM
; Возврат в DOS
RET
START ENDP
C ENDS
END START
Пример 3. Программа для иллюстрации арифметических операции на языке ассемблера.
; Сегмент стека
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
; Сегмент кода – сегмент данных отсутствует, т.к.
; в программе нет переменных
C SEGMENT
ASSUME SS:S,CS:C,DS:NOTHING
START PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX, AX
PUSH AX
;Операции сложения и вычитания
; пример обычного сложения-вычитания
MOV AX, 32
ADD AX, 32
MOV BX, 16
SUB AX, BX
SUB AX, BX
; Переполнение при сложении
SUB AX, AX ; очистка AX. флаг ZF=1
MOV AL, 7Ch ; 124, 01111100 - почти
;максимальное положительное число
ADD AL, 3 ; 127, 01111111
ADD AL, 2 ; =129 беззнаковое, =–127 знаковое
; 10000001 - переполнение (OF=1,
; SF=1)
; Перенос при сложении
MOV AH, 0FAh ; пересылки значений флагов
;не меняют
ADD AH, 3 ;SF=1 (старший бит - 1)
ADD AH, 3 ;CF=1 (сумма не поместилась
; в 8 бит) ZF=1
; Перенос при вычитании
; 12-13 = -1
MOV CX, 12
SUB CX, 1 ; сбросили все флаги
; (не 0, положит., переноса и переполнения нет)
SUB CX, 13 ; CF=1 и SF=1 (старший бит - 1)
; Переполнение при вычитании
; 127 - (-3) = 130, в 7 битах не поместится
; и окажется = –126
SUB DX, DX
SUB CX, CX
MOV DL, 127
MOV CL, -3
SUB DL, CL ; OF=1 CF=1 SF=1
; (127-253, если рассматривать как беззнаковое)
; Возврат в DOS
RET
START ENDP
C ENDS
END START