# #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. большое вам спасибо, это очень помогло!!