Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WOmwwemmjb.file.doc
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
256.51 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]