我是 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 次通過后找不到所有標簽的有效值,放棄。nasm:錯誤:可能的原因:遞回 EQU,宏濫用。
這是我每次在這段代碼中得到的錯誤
uj5u.com熱心網友回復:
l5 equ $-l5應該是l5 equ $-m5,對于其他你從位置減去長度而不是減去兩個位置的人來說也是如此。
此外,該定義本身就是遞回的 ( l5 = stuff - itself),所以這是一個問題。
這就是您收到此錯誤的原因;一旦修復,NASM 就能夠找到其他錯誤并告訴您這些錯誤,但這些錯誤有行號,因此您可以找到哪一行是問題所在。(例如,嘗試cmp choice, 31h,choice符號名稱在哪里,即地址。 cmp不適用于兩個立即數,無論如何這不是您想要的。可能使用default reland cmp byte [choice], 31h。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357358.html
