Системное программное обеспечение. Подготовка к лабораторной работе №2 Структура программы на Ассемблере

Написать программу пересылки из входного массива в выходной байтов не равных коду буквы А (41h). Ввести массив с клавиатуры, вывести результат на экран.

1. Программа состоит из сегментов. Директива SEGMENT открывает сегмент, директива ENDS – закрывает. Синтаксис:

имя SEGMENT [атрибуты]

имя ENDS.

Директива ASSUME связывает имена сегментов с именами сегментных регистров.

Директива END метка – завершает программу (метка определяет адрес, с которого начнется выполнение программы – точку входа).

Комментарии после ;.

Пример 1.

d1 segment para public ‘data’

; здесь место Ваших данных

d1 ends

e1 segment para public ‘data’

; и здесь место Ваших данных

e1 ends

s1 segment para stack ‘stack’

dw 256 dup (?); отвести под стек 256 слов

s1 ends

с1 segment para public ‘code’

assume cs:c1,ds:d1,es:e1,ss:s1

; здесь место команд

start:

;завершение программы

mov ax,4c00h

int 21h

с1 ends

end start

;para - атрибут выравнивания - выравнивание на границу параграфа (начать сегмент с ;адреса кратного 16)

;public - атрибут комбинирования – сегмент будет объединяться с сегментами ;находящимися в других модулях и имеющих такое же имя

; ‘data’ – класс сегмента

2. Определение переменных: имя тип значение.

Директивы определения типа: db – определить байт, dw – слово, dd – двойное слово и др.

Пример 2:

mess db ‘Hello, world!’

n dw 1000

massiv db 10 dup (?)

;dup – оператор повторения, синтаксис - количество_повторов dup (значение)

;? – данные не инициализируются

3.Ввод-вывод – см. SPOlab2.txt, prim1.asm

4. Трансляция

tasm /la /zi имя_файла

Компоновка

tlink /v имя_файла

;prim1.asm

;пересылка байтов из in_str в out_str

;ввод – функция 10 int 21h, вывод –функция 9 int 21h

d1 segment para public 'data'

mess1 db 'Input:',10,13,'$'

in_str db 22 dup (?)

d1 ends

e1 segment para public 'data'

mess2 db 10,13,'Output:',10,13,'$'

out_str db 20 dup ('$')

e1 ends

c1 segment para public 'code'

assume cs:c1,ds:d1,es:e1,ss:st1

start: mov ax, d1

mov ds, ax

mov ax, e1

mov es, ax

mov dx, offset mess1

mov ah,9

int 21h

mov dx, offset in_str

mov in_str,20

mov ah,0ah

int 21h

mov si, offset in_str+2

mov di, offset out_str

mov cl, in_str+1

xor ch, ch

m1: mov al,[si]

mov es:[di],al

inc di

inc si

loop m1

mov ax, es

mov ds, ax

mov dx, offset mess2

mov ah,9

int 21h

mov dx, offset out_str

mov ah,9

int 21h

mov ah,7

int 21h

mov ax,4c00h

int 21h

c1 ends

st1 segment para stack 'stack'

dw 100 dup (?)

st1 ends

end start