Подсчет количества элементов массива на 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 ; Переход к следующему элементу