Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция
Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.
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:
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