Лекция по программированию

Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция

Краткое описание

Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.

Содержимое работы - 1 файл

LECTS.DOC

— 893.00 Кб (Скачать файл)
ify">                         CLD                 ;Сброс флага DF

                         MOV  CX,20          ;Счетчик на 20 байт

                         LEA  DI,STRING2     ;Адрес области "куда"

                         LEA  SI,STRING1     ;Адрес области "откуда"

                         REP MOVSB           ;Переслать данные

     При  выполнении  команд  CMPS  и  SCAS  возможна  установка    флагов состояния, так чтобы операция могла прекратиться сразу  после  обнаружения необходимого условияНиже приведены модификации префикса  REP  для  этих целей:

REP -               повторять операцию, пока CX не равно 0;

REPZ или REPE -     повторять операцию, пока флаг ZF показывает "равно или ноль". Прекратить операцию при флаге ZF,  указывающему на не равно или не ноль или при CX равном 0;

REPNE или REPNZ -   повторять операциюпока флаг ZF показывает "не равно или  не  ноль".  Прекратить  операцию  при  флаге  ZF, указывающему на "равно или нуль" или при CX равным 0.

Для  процессоров  8086,  80286  и  80386,  обрабатывающих  слово  за  oдно выполнение, использование цепочечных команд, где это возможно, приводит  к повышению эффективности работы программы.

MOVS: ПЕРЕСЫЛКА СТРОК

Для областипринимающей  строкусегментным  регистром,   является pегистр ES,  а регистр DI содержит относительный адрес области, передающей строкуСегментным регистром является регистр DS,  а регистр SI  содержит относительный адресТаким образомв начале программы перед выполнением команды MOVS необходимо инициализировать регистр ES вместе с регистром DS, а также загрузить требуемые относительные адреса полей в регистры DI и SI. В зависимости от состояния флага DF команда MOV  S  производит  увеличение или уменьшение на 1 (для байта) или на 2 (для слова) содержимого регистров DI и SI.

     Приведем команды, эквивалентные цепочечной команде REP MOVSB:

                 JCXZ      LABEL2

     LABEL1:     MOV       AL,[SI]

                 MOV       [DI],AL

                 INC/DEC   DI        ;Инкремент или декремент

                 UNC/DEC   SI        ;Инкремент или декремент

                 LOOP      LABEL1

     LABEL2:     ...

     В программе процедура C10MVSB  использует  команду  MOVSB для пересылки содержимого десятибайтового поля NAME1 в поле NAME2.  Первая команда CLD сбрасывает флаг  направления  в  0  для  обеспечения  процесса пересылки слева направоВ нормальном  состоянии  флаг  DF  обычно  имеет нулевое значение и команда CLD используется из предосторожности.

 

Пример: Использование цепочечных команд.

 

STACKSG SEGMENT PARA STACK 'Stack'

        DW      32 DUP(?)

STACKG  ENDS

; ---------------------------------------------------

DATASG  SEGMENT PARA 'Data'

NAME1   DB      'Assemblers'    ;Элементы данных

NAME2   DB      10 DUP(' ')

NAME3   DB      10 DUP(' ')

DATASG  ENDS

; ---------------------------------------------------

CODESG  SEGMENT PARA 'Code'

BEGIN   PROC    FAR             ;Основная процедура

        ASSUME  CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG

        PUSH    DS

        SUB     AX,AX

        PUSH    AX

        MOV     AX,DATASG

        MOV     DS,AX

        MOV     ES,AX

        CALL    C10MVSB         ;Подпрограмма MVSB

        CALL    D10MVSW         ;Подпрограмма LODS

        CALL    E10LODS         ;Подпрограмма LODS

        CALL    F10STOS         ;Подпрограмма CMPS

        CALL    H10SCAS         ;Подпрограмма SCAS

        RET

BEGIN   ENDP

;               Использование MOVSB:

;               -------------------

C10MVSB PROC    NEAR

        CLD

        LEA     SI,NAME1

        LEA     D1,NAME2

        MOV     CX,10           ;Переслать 10 байтов

        REP MOVSB               ; из NAME1 в NAME2

        RET

C10MVSB ENDP

;               Использование MOVSW:

;               -------------------

D10MVSW PROC    NEAR

        CLD

        LEA     SI,NAME2

        LEA     DI,NAME3

        MOV     CX,05           ;Переслать 5 слов

        REP MOVSW               ; из NAME2 в NAME3

        RET

D10MVSW ENDP

;               Использование LODSW:

;               -------------------

E10LODS PROC    NEAR

        CLD

        LEA     SI,NAME1        ;Загрузить первое слово

        LODSW                   ; из NAME1 в AX

        RET

E10LODS ENDP

;               Использование STOSW:

;               -------------------

F10STOS PROC    NEAR

        CLD

        LEA     D1,NAME3

        MOV     CX,05

        MOV     AX,2020H        ;Переслать пробелы

        REP STOSW               ; в NAME3

        RET

F10STOS ENDP

;               Использование CMPSB:

;               -------------------

G10CMPS PROC    NEAR

        CLD

        MOV     CX,10

        LEA     SI,NAME1

        LEA     DI,NAME2

        REPE CMPSB              ;Сравнить NAME1 и NAME2

        JNE     G20             ;Не равны?

        MOV     BH,01

 

G20:    MOV     CX,10

        LEA     SI,NAME2

        LEA     DI,NAME3

        REPE CMPSB             ;Сравнить NAME2 и NAME3

        JE      G30             ;Если равны, то выйти

        MOV     BL,02

G30:    RET

G10CMPS ENDP

 

;               Использование SCASB:

;               -------------------

H10SCAS PROC    NEAR

        CLD

        MOV     CX,10

        LEA     DI,NAME1

        MOV     AL,'m'          ;Поиск символа 'm'

        REPNE SCASB             ; в NAME1

        JNE     H20             ;Если не найден - выйти

        MOV     AH,03

H20:    RET

H10SCAS ENDP

CODES   ENDS

        END     BEGIN

Информация о работе Лекция по программированию