mov dx, data4 ; адрес области данных
int 21h ;
mov ax, 4c00h ; завершение программы и
int 21h ; возврат управления ОС
main endp
end main ; конец программы с точкой входа
; main
При написании программы на языке ассемблера рекомендуется размещать сегмент команд в самом конце программы. Кроме того, следует иметь в виду, что если даже сама программа стек и не использует, описывать в программе сегмент стека все равно следует, поскольку он обычно используется самой операционной системой при обработке прерываний, возникающих в процессе счета программы. Обычно для этого резервируется не более 128 байт стековой памяти сверх того, что необходимо программе.
Сегменты, как правило, загружаются в том порядке, в котором они описываются в тексте программы, хотя в принципе порядок загрузки можно изменить с помощью специальных директив.
В конце программы обязательно надо указать директиву END. Она является признаком конца текста программы, все строки за ней считаются уже не относящимися к программе. Обычно операндом этой директивы является так называемая точка входа в программу – метка той команды, с которой должно начинаться выполнение программы (в общем случае это не обязательно первая команда программы).
В заключение заметим, что Ассемблер не накладывает на процедуры (подпрограммы) никаких ограничений – на любом адресе программы можно передать управление на подпрограмму командой CALL, и как только встретится в ней команда RET, управление вернется в основную программу для продолжения ее выполнения. Однако, для удобства чтения и понимания ассемблерных программ, были введены специальные директивы логического оформления процедур – proc. При этом процедура оформляется следующим образом:
метка proc [необязательные параметры – операнды]
. ; тело
. ; задаваемой
. ; процедуры
ret
метка endp
Наконец, приведем еще один пример листинга ассемблерной программы на сравнение двух строк, взятый непосредственно из учебника В.И. Юрова «Assembler» (стр. 238).
1 ; progr1.asm
2 .model small
3 .stack 256
4 .data
5 match db 0ah,0dh,’Строки совпадают’,’$’
6 failed db 0ah,0dh,’Строки не совпадают’,$’
7 string1 db “0123456789”,0ah,0dh,’$’ ;исследуемые строки
8 string2 db “0123406789”,’$’
9 .code
10 assume ds:@data, es:@data ;привязка DS и ES к сегменту данных
11 main:
12 mov ax,@data ;загрузка сегментных регистров
13 mov ds,ax
14 mov es,ax ;настройка ES на DS
15 ;вывод на экран исходных строк string1 и string2
16 mov ah,09h
17 lea dx,string1
18 int 21h
19 lea dx,string2
20 int 21h
21 ;сброс флага DF – сравнение в направлении возрастания адресов
22 cld
23 lea si,string1 ;загрузка в si смещения string1
24 lea di,string2 ;загрузка в di смещения string2
25 mov cx,10 ;загрузка длины строки для префикса repe
26 ;сравнение строк (пока сравниваемые элементы строк равны)
27 ;выход при обнаружении несовпавшего элемента
28 cycl:
29 repe cmps string1,string2
30 jcxz equal ;cx=0, то есть строки совпадают
31 jne not_match ;если не равны – переход на not_match
32 equal: ;иначе, если совпадают, то вывод
33 mov ah,09h ;сообщения
34 lea dx,match
35 int 21h
36 jmp exit ;выход
37 not_match: ;не совпали
38 mov ah,09h
39 lea dx,faild
40 int 21h ;вывод сообщения
41 ;теперь, чтобы обработать несовпавший элемент в строке, необходимо
42 ;уменьшить значения регистров si и di
43 dec si
44 dec di
45 ;сейчас в ds:si и es:di адреса несовпавших элементов
46 ;здесь вставить код по обработке несовпавшего элемента
47 ;и после этого продолжить поиск в строке:
48 inc si
49 inc di
50 jmp cycle
51 exit: ;выход
52 mov ax,4c00h
53 int 21h
54 end main ;конец программы
В качестве кода по обработке несовпавшего элемента можно, например, ввести две команды, которые бы заменяли несовпавший элемент строки “string2” на соответствующий ему элемент строки “string1”, то есть:
mov ax, [ds:si]
mov [es:di], ax
П. 3. ПЕРЕЧЕНЬ НЕКОТОРЫХ АБРЕВИАТУР
AGP 1x (AcceleratedGraphicsPortx1) – Ускоренный графический порт (шина) - однократной пропускной способности, соответствующей 266 Мбайт/с.
ATA (AdvancedTechnologyAttachment) – протокол (интерфейс) для работы с жесткими дисками (другое название интерфейса IDE (IntegratedDeviceElectronics).
AVX (AdvancedVectorExtension) – Набор векторных команд, который был внедрен впервые в 32-нанометровых процессорах с микроархитектурой Sandy Bridge. По заявлению Intel его использование позволяет увеличить в два раза количество операций с плавающей запятой в секунду.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.