Инструкция цикла loopq

Последнее обновление: 23.09.2023

Инструкция loopq позволяют сократить определение цикла. Она уменьшает на 1 число в регистре RCX и переходит к определенной метке, если RCX не равен нулю:

.globl _start
.text
_start:
    movq $5, %rcx   # регистр-счетчик
    movq $0, %rdi
mainloop:           # цикл
    addq $2, %rdi   # некоторые действия цикла
    loopq mainloop  # уменьшаем значение в %rcx на 1, переходим к метке mainloop, если %rcx не содержит 0

    movq $60, %rax
    syscall

Здесь вначале инициализируем регистр-счетчик число 5. То есть цикл сделает 5 проходов. Цикл проектируется на метку mainloop. В цикле для теста увеличивает значение в регистре RDI на 2 и с помощью loopq mainloop уменьшаем значение в RCX на 1. И если в RCX НЕ число 0, возвращаемся к метке mainloop.

Инструкция loopq имеет два дополнительных варианта: loopeq и loopneq. loopeq продолжает цикл, если установлен флаг нуля. Инструкция loopneq, наоборот, повторяет цикл, если флаг нуля не установлен. Например, применение инструкции loopneq:

.globl _start
.text
_start:
    movq $6, %rcx   # регистр-счетчик
    movq $0, %rdi
mainloop:           # цикл
    addq $2, %rdi   # некоторые действия цикла
    loopneq mainloop  # уменьшаем значение в %rcx на 1, переходим к метке mainloop, если %rcx не содержит 0

    movq $60, %rax
    syscall

В принципе тут все то же самое: loopneq уменьшает значение в RCX на 1 и проверяет флаг нуля. Если флаг нуля не установлен, программа переходит обратно к метке mainloop.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850