КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА - Турбо Ассемблер 3.0/tasm/#2-2 - Стр. 37

Индекс материала
Турбо Ассемблер 3.0/tasm/#2-2
Стр. 2
Стр. 3
Стр. 4
Стр. 5
Стр. 6
Стр. 7
Стр. 8
Стр. 9
Стр. 10
Стр. 11
Стр. 12
Стр. 13
Стр. 14
Стр. 15
Стр. 16
Стр. 17
Стр. 18
Стр. 19
Стр. 20
Стр. 21
Стр. 22
Стр. 23
Стр. 24
Стр. 25
Стр. 26
Стр. 27
Стр. 28
Стр. 29
Стр. 30
Стр. 31
Стр. 32
Стр. 33
Стр. 34
Стр. 35
Стр. 36
Стр. 37
Стр. 38
Стр. 39
Стр. 40
Стр. 41
Стр. 42
Стр. 43
Стр. 44
Стр. 45
Стр. 46
Стр. 47
Стр. 48
Стр. 49
Стр. 50
Стр. 51
Стр. 52
Стр. 53
Стр. 54
Все страницы

          program EnvTest;
          { программа ищет строки операционной среды }

          var
            EnvVariable : string;
            EnvValue    : string;

     Турбо Ассемблер 3.0/tasm/#2-2                             = 144 =


          {$F+}

          function EnvString(s:string) : string; external;
          {$L ENVSTRING.OBJ}
          {$F-}
          begin
            EnvVariable := 'PROMPT';
            EnvValue := EnvString(EnvVariable);
            if EnvValue = '' then EnvValue := '*** не найдена ***';
            Writeln('Переменная операционной среды: ',
                     EnvVariable,' Значение: ',EnvValue);
          end.

          Чтобы сформировать и запустить данные программы на Паскале и
     Ассемблере, используйте следующие команды командного файла:

          TASM ENVSTR
          TPC ENVTEST
          ENVTEST

          Если использовать директиву .MODEL,  то функция EnvString на
     Ассемблере будет выглядеть следующим образом (ENVMOD.ASM):

                    .MODEL   large, PASCAL
                    .DATA
                    EXTRN prefixSeg : Word  ; дает адрес PSP
                    .CODE
     EnvString      PROC FAR  EnvVar:DWORD  RETURNS EnvVal:DWORD
                    PUBLIC  EnvString
                    push    bp
                    cld                     ; работать в прямом
                                            ; направлении
                    mov     es,[prefixSeg]  ; посмотреть PSP
                    mov     es,es:[2Ch]     ; ES:DI указывают на
                                            ; операционную среду,
                    xor     di,di           ; которая выровнена на
                                            ; границу параграфа
                    mov     bp,sp           ; найти строку параметров,
                    lds     si,ss:[bp+6]    ; которая следует за
                                            ; адресом возврата
                    ASSUME  ds:NOTHING
                    lodsb                   ; посмотреть длину
                    or      al,al           ; она равна 0?
                    jz      RetNul          ; да, возврат
                    mov     ah,al           ; в противном случае
                                            ; сохранить ее в AH
                    mov     dx,si           ; DS:SI содержат указатель
                                            ; на первый параметр
                                            ; char
                    xor     al,al           ; сделать его равным 0
     Compare:
                    mov     ch,al           ; мы хотим, чтобы для

     Турбо Ассемблер 3.0/tasm/#2-2                             = 145 =

                                            ; следующего отсчета ch=0
                    mov     si,dx           ; возвратить указатель на
                                            ; просмотренную строку
                    mov     cl,ah           ; получить длину
                    mov     si,dx           ; возвратить указатель на
                                            ; строку
                    repe    cmpsb           ; сравнить байты
                    jne     Skip            ; если сравнение неудач-
                                            ; ное, попробовать следу-
                                            ; ющую строку
                    cmp     byte ptr es:[di],'=' ; сравнение
                                            ; завершилось успешно
                                            ; следующий символ '='?
                    jne     NoEqual         ; если нет, все еще нет
                                            ; совпадения
     Found:
                    mov     ax,es           ; DI:SI будет указывать
                                            ; на найденную нами строку
                    mov     ds,ax
                    mov     si,di
                    inc     si              ; "пройти" символ '='
                    les     bx,ss:[bp+10]   ; получить адрес
                                            ; результата функции
                    mov     di,bx           ; занести его в ES:DI
                    inc     di              ; байт длины
                    mov     cl,255          ; задать максимальную
                                            ; длину
     CopyLoop:
                    lodsb                   ; получить байт
                    or      al,al           ; проверить на 0
                    jz      Done            ; если 0, выполнено

                    stosb                   ; занести его в результат
                    loop    CopyLoop        ; переместить до 255
                                            ; байт
     Done:          not     cl              ; при сохранении мы
                                            ; уменьшали от CL до 255
                    mov     es:[bx],cl      ; сохранить длину
                    mov     ax,SEG DATE
                    mov     ds,ax           ; восстановить DS
                    ASSUME  ds:DATA
                    pop     bp
                    ret     4
                    ASSUME  ds:NOTHING
     Skip:
                    dec     di              ; проверять на 0
     NoEqual:
                    mov     cx,7FFFh        ; длинный поиск, если
                                            ; нужно
                    sub     cx,di           ; операционная среда
                                            ; никогда не превышает
                                            ; 32К
                    jbe     RetNul          ; если конец, выйти
                    repne   scasb           ; посмотреть следующий

     Турбо Ассемблер 3.0/tasm/#2-2                             = 146 =

                                            ; 0
                    jcxz    RetNul          ; выйти, если не найден
                    cmp     byte ptr es:[di],al ; второй 0 в строке?
                    jne     Compare         ; если нет, попытаться
                                            ; снова
     RetNul:
                    les     di,ss:[bp+10]   ; получить адрес
                                            ; результата
                    stosb                   ; сохранить там 0
                    mov     ax,SEG DATA
                    mov     ds,ax           ; восстановить DS
                    ASSUME  ds:DATA
                    ret     4
     EnvString      ENDP
     CODE           ENDS
                    END

          Вы можете использовать ту же программу на Паскале  и  просто
     ассемблировать  альтернативный  вариант функции EnvString и пере-
     компилировать программу с помощью того же командного файла.





     Турбо Ассемблер 3.0/tasm/#2-2                             = 147 =

                          Часть 2. ПРИЛОЖЕНИЯ
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

          Далее следует содержимое приложений.



     Турбо Ассемблер 3.0/tasm/#2-2                             = 148 =

               Приложение A. Замечания по программированию
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

          В данном приложении приведена основная информация по постро-
     ению программ с конкретными моделями памяти и форматами выполняе-
     мого кода.

                Упрощенные директивы определения сегмента
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

          В следующей  таблице  показаны используемые по умолчанию для
     каждой модели памяти атрибуты сегмента.

      Используемые по умолчанию сегменты и типы для модели памяти TINY
                                                           Таблица A.1
     ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
     і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
     і.CODE      _TEXT    WORD         PUBLIC      'CODE'     DGROUP і
     і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
     і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
     і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
     і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
     і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
     іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
     і                                                               і
     і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
     іFARSTACK, заданным в директиве MODEL.                          і
     АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Используемые по умолчанию сегменты и типы для модели памяти SMALL
                                                           Таблица A.2
     ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
     і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
     і.CODE      _TEXT    WORD         PUBLIC      'CODE'            і
     і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
     і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
     і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
     і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
     і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
     іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і