Системное программное обеспечение. Подготовка к лабораторной работе №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


