Подсчет количества элементов массива на Assembler

есть пример кода программы, но не пойму как переделать под условие: abs(Xi)≤5

Пример кода:

format PE64 console
entry main

include 'win64ax.inc'

section '.data' data readable writable
A dq -5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10   ; Массив
Size=($-A)/9                 ; Размер массива
fmt_out   db 'k=%llu',13,10,0 ; Формат вывода - беззнаковый
cmd_pause db 'pause',0        ; Команда паузы

section '.text' code executable
proc main
xor rbx,rbx     ; Инициализация результата нулём
mov rcx,Size    ; Загрузка размера массива
cld             ; Направление сканирования - вперёд
mov rsi,A       ; Установка указателя на начало массива
; Цикл сканирования массива
@@:lodsq        ; Загрузка очередного элемента
   cmp rax,10   ; Проверка на x>=10
   jge Next     ; x>=10 - идти дальше
   cmp rax,1    ; Проверка на x<=1
   jle Next     ; x<=1 - идти дальше
   inc rbx      ; Условия соблюдены - инкремент результата
   Next:loop @b ; Переход к следующему элементу

invoke printf_s,fmt_out,rbx  ; Вывод результата
invoke system,cmd_pause      ; Ожидание нажатия клавиши
xor rax,rax
ret
endp

section '.idata' import data readable writeable
library msvcrt,'msvcrt.dll'
import  msvcrt,\
        system,'system',\
        scanf_s,'scanf_s',\
        printf_s,'printf_s'

Ответы (1 шт):

Автор решения: insolor

Условие abs(Xi)≤5 можно представить как -5 <= Xi <= 5, а в примере кода у вас условие 1 < Xi < 10. По сути нужно границы условия поменять и jge и jle заменить на jg и jl (переход к следующему элементу при строго > 5 и строго меньше < -5):

; Цикл сканирования массива
@@:lodsq        ; Загрузка очередного элемента
   cmp rax,5    ; Проверка на x > 5
   jg Next      ; x > 5 - идти дальше
   cmp rax,-5   ; Проверка на x < -5
   jl Next      ; x < -5 - идти дальше
   inc rbx      ; Условия соблюдены - инкремент результата
   Next:loop @b ; Переход к следующему элементу
→ Ссылка