ошибка: не удалось найти допустимые значения для всех меток после 1003 проходов; застопорился на 1001, отказавшись

# #string #assembly #x86-64 #nasm

Вопрос:

Я новичок в кодировании NASM, пробовал строковые операции, но продолжаю получать ошибку:

не удалось найти допустимые значения для всех меток после 1003 проходов; застопорился на 1001, сдался.

Перепробовал все методы в Интернете, но не смог найти никакого решения.

 %macro scall 4   mov rax,%1  mov rdi,%2  mov rsi,%3  mov rdx,%4  syscall ;call the kernel  %endmacro  %macro quit 0  mov rax,60   mov rdi,0   syscall  %endmacro  section .data  m1 db 10d,13d,"Enter the String",10d  l1 equ $-m1  m2 db 10d,13d,"Length of string",10d,13d  l2 equ $-m2  m3 db 10d,13d,"Reversed String",10d,13d  l3 equ $-m3  m4 db 10d,13d,"🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁🍁"  l4 equ $-m4  m5 db 10d,13d, "1.Enter the String "  l5 equ $-l5  m6 db 10d,13d, "2.Length of String "  l6 equ $-l6  m7 db 10d,13d, "3.Reverse of String"  l7 equ $-l7  m8 db 10d,13d, "4.exit"  l8 equ $-l8   section .bss  string resb 50  string2 resb 50  length resb 16  answer resb 16  choice resb 8   section .text  global _start _start: scall 1,1,m4,l4  menu:   scall 1,1,m5,l5  scall 1,1,m6,l6  scall 1,1,m7,l7  scall 1,1,m8,l8  scall 0,0,choice,2   case1: cmp choice,31h je enterstring  case2:  cmp choice,32h je len  case3:  cmp choice,33h je rev  case4:  cmp choice,34h je exit    scall 1,1,m4,l4   enterstring:  scall 1,1,m4,l4  scall 1,1,m1,l1  scall 0,0,string,50  jmp menu   len:  mov [length],rax   scall 1,1,m2,l2  mov rax,[length]  call display ;call display procedure  jmp menu   rev:  scall 1,1,m3,l3  call reverse  jmp menu  exit: quit  ;*******DISPLAY LENGTH ***********  display: ;hex to ascii-hex  mov rbp,answer  mov rcx,2  loop1:  rol al,04  mov dl,al   and dl,0Fh   cmp dl,09h  jbe loop2  add dl,07h  loop2:  add dl,30h   mov [rbp],rdx   inc rbp  dec rcx  jnz loop1  scall 1,1,answer,6  ret  ;****** DISPLAY REVERSE STRING******* reverse:  mov rsi,string ; point rsi to first byte of original srting  mov rdi,string2 ; point rdi to first byte of reversed string   mov rcx,[length] ; counter   add rsi,rcx ; point rsi to next byte after original string   dec rsi ; now rsi points to last byte next:  mov rax,[rsi] ;move character to al   mov [rdi],rax ;Copy character to string2  dec rsi  inc rdi  loop next scall 1,1,string2,50 ret  

Это ошибка NASM, которую я получаю каждый раз в этом коде:

ошибка: Не удается найти допустимые значения для всех меток после 1000 проходов, отказ.
ошибка: Возможные причины: рекурсивные уравнения, злоупотребление макросами.

Комментарии:

1.Отдельно от того, что вызывает эту ошибку сборки, обычно не имеет смысла использовать 10d,13d nr обратные окончания строк DOS в программе, использующей системные вызовы Linux. Разделитель строк Linux-это просто n , т. е. 0xa он же 10

Ответ №1:

l5 equ $-l5 должно быть l5 equ $-m5 , и аналогично для других, где вы вычитаете длины из позиций вместо вычитания двух позиций.

Кроме того, само это определение само по себе рекурсивно ( l5 = stuff - itself ), так что это проблема.


Вот почему вы получаете эту ошибку; после исправления NASM может перейти к другим ошибкам и сообщить вам о них, но у них есть номера строк, чтобы вы могли определить, в какой строке проблема. (например, попытка cmp choice, 31h , где choice имя символа, т. Е. адрес. cmp не работает с двумя непосредственными партнерами, и в любом случае это не то, чего вы хотите. Используйте default rel и cmp byte [choice], 31h , возможно.)

Комментарии:

1. большое вам спасибо, это очень помогло!!