Здарова. Ниже - решение, которое вызывает segv по непонятной причине. пробовал заменить loopneq на loop с ручным выходом, но segv никуда не исчез (loopq вместо loopneq и je exit под cmoveq EXIT_SUCCESS). задача - найти val в arr
.equ QLEN, 8 # размер quadword
.equ SYS_EXIT, 60 # номер выхода
.equ EXIT_FAILURE, 0 # код "не найден"
.equ EXIT_SUCCESS, 1 # код "найден"
.section .data
val: .quad 9 # значение, которое ищем в массиве
len: .quad 5 # длина массива
arr: .quad 4, 9, 3, 8, 4 # массив
.section .text
.globl _start
_start:
movq val, %rax # грузим val, который ищем в массиве
movq EXIT_FAILURE, %rdi # грузим код "не найден"
movq len, %rcx # грузим длину массива
cmpq $0, %rcx # проверяем на наличие элементов
je exit # завершаем при отсутствии элементов
loop:
# итерация с последнего элемента по первый
movq arr-QLEN(,%rcx,QLEN), %rdx # arr - 8 + rcx * 8 (первая итерация - последний элемент)
cmpq %rdx, %rax # сравниваем загруженный элемент с val
cmoveq EXIT_SUCCESS, %rdi # если равен, грузим код успеха
loopneq loop # если не равен, итерируем (декремент rcx, итерация. если rcx == 1, итерация превратит его в 0 и не прыгнет)
exit:
movq SYS_EXIT, %rax # грузим код выхода
syscall # выходим
c чем связан segv? спс

