Инструкция 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.