LINUX.ORG.RU

Сообщения P0085

 

segv при элементарном обходе массива

 ,

Здарова. Ниже - решение, которое вызывает 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? спс

P0085
()

RSS подписка на новые темы