→ Пошук по сайту       Увійти / Зареєструватися

Команди асемблера для Intel: 386+ LODSD, LOOP, Loope/loopz, 386р+ LSL

386+ LODSD Завантаження подвійного слова з рядка

Команда аналогічна командам МП 86 lodb і lodsw, але дозволяє завантажити з рядка, що адресується через регістри Ds:esi (Ds:si для 16-розрядних застосувань), подвійне слово в регістр ЕАХ.

Приклад

; У полях даних
dat dd 12789,200000,550000,8000000
;В програмному сегменті
mov Si,offset dat
add SI, 4*3 ;DS:SI -> 4-й елемент масиву чисел
lodsd ;EAX=8000000

LOOP Циклічне виконання, поки вміст СХ не дорівнює нулю

Команда loop виконує декремент вмісту регістра СХ, і якщо воно не дорівнює 0, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні -128... + 127 байт. Зазвичай мітка поміщається перед першою пропозицією тіла циклу, а команда loop є останньою командою циклу. Вміст регістра СХ розглядається як ціле число без знаку, тому максимальне число повторень групи включених в цикл команд складає 65536 (якщо перед входом в цикл Сх=0). Команда не впливає на прапори процесора.

Приклад 1

;У полях даних:
array dw 4096 dup (?) ;Массив з 4096 слів
;У програмному сегменті:
lea Bx,array ;ВХ -> array
xor Si,si ;SI=0
mov Cx,4096 ;Счетчик повторень
mov Ax,1 ;Число-заполнитель
array: mov [BX] [SI],ax ;Очистка елементу масиву
inc SI ;Сдвиг до наступного
inc SI ;слову масиву
loop array ;Повторить СХ разів

Приклад 2

mov Cx,20
delay :loop delay ;Небольшая затримка

При використанні як лічильник розширеного регістра ЕСХ максимальне число кроків в циклі збільшується до 232. Для того, щоб в 16-розрядному застосуванні процесор при виконанні команди loop використовував не 16-розрядний регістр СХ, а 32-розрядний регістр ЕСХ, перед командою loop необхідно вказати префікс заміни розміру адреси 67h.

Приклад

mov Есх,о
zzzz: db 67h ;Префикс заміни розміру адреси
loop zzzz ;Цикл з 232: кроків, що реалізовує
;програмну затримку близько хвилин

Loope/loopz Циклічне виконання, поки равно/циклічеськоє виконання, поки нуль

Обома позначенням є синоніми і відносяться до однієї команди. Команда виконує декремент вмісту регістра СХ, і якщо воно не дорівнює 0, і прапор ZF встановлений, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні -128...+127 байтів. Вміст регістра СХ розглядається як ціле число без знаку, тому максимальне число повторень групи включених в цикл команд складає 65536. Команда не впливає на прапори процесора.

Приклад

;У полях даних, що адресуються через DS:
command db 80 dup (' ')
;У програмному сегменті:
. . . ;Копіювання в полі command рядка
;вміст якої слід аналізувати
lea SI, command ;Настроим Ds:si
сld ;Обработка вперед
mov Cx,80 ;Обрабатывать не більше 80
;байтів
pass: lodsb ;Загрузим у AL черговий
;символ
сmр Аl ' ' ;Пропустим всі пропуски в
loopepass ;начале рядки
dec SI ;Сдвиг на 1 символ назад
;Ds:si -> перший символ, відмінний від пропуску

При використанні як лічильник розширеного регістра ЕСХ максимальне число кроків в циклі збільшується до 232. Для того, щоб в 16-розрядному застосуванні процесор при виконанні команд loope/loopz використовував не 16-розрядний регістр СХ, а 32-розрядний регістр ЕСХ, перед командами loope/loopz необхідно вказати префікс заміни розміру адреси 67h.

Приклад

mov ЕСХ, 1000000 ;Предельное число кроків
хххх: ... ;Тело циклу
db 67h
loopexxxx

Loopne/loopnz Циклічне виконання, поки не равно/циклічеськоє виконання, поки не нуль

Обома позначенням є синоніми і відносяться до однієї команди. Команда виконує декремент вмісту регістра СХ, і якщо воно не дорівнює 0, і прапор ZF скинутий, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні -128... + 127 байтів. Вміст регістра СХ розглядається як ціле число без знаку, тому максимальне число повторень групи включених в цикл команд складає 65536. Команда не впливає на прапори процесора.

Приклад

;У полях даних:
command db 80 dup (0)
;У програмному сегменті:
. . . ;Копіювання в полі command рядка
; вміст якої слід аналізувати
lea Si,command ;Настроим Ds:si
cld ;Обработка вперед
mov Cx,80 ;Обрабатывать не більше 80
;байтів
slash: lodsb ;Загрузим у AL черговий символ
cmp AL ' / ' ;Ищем знак ' / '
loopne slash ;во всьому рядку
;Ds:si -> перший символ за знаком '/'

При використанні як лічильник розширеного регістра ЕСХ максимальне число кроків в циклі збільшується до 232. Для того, щоб в 16-розрядному застосуванні процесор при виконанні команд loopne/loopnz використовував не 16-розрядний регістр СХ, а 32-розрядний регістр ЕСХ, перед командами loopne/loopnz необхідно вказати префікс заміни розміру адреси 67h.

Приклад

mov Есх,1000000 ;Предельное число кроків
хххх: . . . ;Тело циклу
db 67h
loopne xxxx

386р+ LSL Завантаження межі сегменту

Команда Isl завантажує в перший операнд межу сегменту з дескриптора сегменту, заданого селектором в другому операнді.

Як перший операнд команди Isl можна використовувати 16- або 32-розрядний регістр загального призначення; як другий - 16- або 32-розрядний регістр загального призначення або 16- або 32-бітове поле пам'яті.

загрузка...
Сторінки, близькі за змістом