Цель работы
Изучение команд передачи управления и основ программирования итеративных циклических вычислительных процессов.
Команды управления циклами
LOOP метка уменьшает значение регистра CX на 1, и если CX≠0 (флаг ZF сброшен) передает управление к строке «метка», иначе выполняет инструкцию, следующую за LOOP. LOOPE метка LOOPZ метка аналогично LOOP, но переходит к строке «метка» при дополнительном условии: если инструкция, предшествующая LOOP, вернула 0 (флаг ZF установлен). LOOPNE метка LOOPNZ метка аналогично LOOP, но переходит к строке «метка» при дополнительном условии: если инструкция, предшествующая LOOP, вернула не 0 (флаг ZF сброшен).
Схема алгоритма
Таблица состояний регистров
Строчки “9#” и “10#” соответствуют последней (успешной) итерации цикла.
Дамп памяти (до записи значения)
Ds:0000 | 0A | 24 | 01 | 01 | 01 | 01 | 01 | 01 |
Ds:0008 | 01 | 00 | 02 | 02 | 00 | 00 | 00 | 00 |
Дамп памяти (после записи значения)
Ds:0000 | 0A | 24 | 01 | 01 | 01 | 01 | 01 | 01 |
Ds:0008 | 01 | 24 | 02 | 02 | 00 | 00 | 00 | 00 |
Листинг программы
.model small
.stack 100h
.data
N db 10
a db 36d
MAS db 7 dup(1), 0, 2 dup(2)
.code
Start:
mov ax, @data
mov ds, ax
; задание
mov di, offset MAS ; MAS = DS:DI
xor cx, cx ; cx = 0
mov cl, N ; cx = N
mov bx, 0FFFFh ; на 1 итерации должно быть bx = 0
Loop1:
inc bx ; bx = bx + 1
mov al, [di + bx] ; al = [MAS + bx]
test al, al ; al == 0 ?
loopnz loop1 ; нет => перейти на loop1
mov al, a ; al = a
mov [di + bx], al ; [MAS + bx] = a
; завершение работы
mov ax, 4C00h
int 21h
End start
Выводы:
1) мы научились использовать команды управления циклами;
2) мы поняли, как использовать адресацию со смещением для обращения к элементам массива, расположенным в памяти.