Введение в технологию программирования на языке Ассемблера, страница 9

                    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 его использование позволяет увеличить в два раза количество операций с плавающей запятой в секунду.