LINUX.ORG.RU

Сообщения P0085

 

.equ '\0' это то же, что .equ '0'

 ,

В обоих случаях objdump -d test.s покажет вам 0x30 (ascii для числового представления текста ‘0’). Вопрос: это баг или фича?

  401010:	3c 30                	cmp    $0x30,%al

Предположительно - это баг, т.к. .equ ‘\n’ - это 0xa:

Disassembly of section .text:

0000000000000000 <_start>:
   0:	48 c7 c1 30 00 00 00 	mov    $0x30,%rcx
   7:	48 c7 c7 30 00 00 00 	mov    $0x30,%rdi
   e:	48 c7 c0 0a 00 00 00 	mov    $0xa,%rax
  15:	48 c7 c0 3c 00 00 00 	mov    $0x3c,%rax
  1c:	0f 05                	syscall

сорс:

.equ NOL, '0'
.equ NUL, '\0'
.equ ABZAC, '\n'

.section .text
.globl _start
_start:
  movq $NOL, %rcx
  movq $NUL, %rdi
  movq $ABZAC, %rax
  movq $60, %rax
  syscall
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 подписка на новые темы