Ich habe beim Verknüpfen meiner Objektdatei einen undefinierten Verweis auf 'esp' erhalten.
Ich habe meinen Assembler-Code in die Datei mydc.s geschrieben
Dann habe ich eine Objektdatei mit erstellt
as --32 -march=i386 mydc.s -o mydc.o
(Es gab hier keinen Fehler) Dann verknüpfte es mit
gcc -m32 -march=i386 mydc.o -o mydc
Dann wurde eine Fehlermeldung als erstellt
(.text + 0x2a): undefinierter Verweis auf 'esp'
Der Code lautet wie folgt
.section ".text"
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
input:
pushl $buffer
pushl $scanfFormat
call scanf
addl $8, %esp
## check if user input EOF
cmp $EOF, %eax
je quit
pushl $buffer
call isdigit
addl $4, esp
cmp $1, %eax
je if_digit
movl buffer, %eax
cmpl $'p', %eax
je if_p
cmpl $'q', %eax
je if_q
cmpl $'+', %eax
je if_plus
if_p:
movl iIndex, %eax
sall $2, %eax
addl $stack, %eax
pushl %eax
pushl $resultFormat
call printf
addl $8, %esp
jmp input
Was ich nicht verstehe ist, dass esp keine Variable oder Funktion ist, sondern nur ein Registername und daher keinen undefinierten Referenzfehler erzeugen sollte.
Warum passiert das und wie kann ich das beheben?
Das Problem wird durch diese Zeile verursacht:
addl $4, esp
Überall sonst geben Sie Register beim %
Dekorateur an, wie dies beispielsweise für die AT & T-Syntax erforderlich ist %esp
.
Der Sinn dieses Dekorateurs besteht darin, Registernamen von Symbolnamen zu unterscheiden - das Undekorierte esp
ist eher ein Symbol als ein Register, genau wie if_digit
.
Dies erklärt, warum der Linker versucht, etwas zu finden, das aufgerufen wird esp
(und fehlschlägt). Es ist auch der Grund, warum Ihre Fehlermeldung Undefined reference to 'esp'
im Gegensatz zu lautet '%esp'
.
Das Erfordernis von Dekorateuren für Registernamen bedeutet, dass asm source gegen die Einführung neuer Registernamen zukunftssicher ist. Wenn Sie beispielsweise eine globale Variable aufgerufen hätten, xmm0
bevor SSE gekauft wurde, würde Ihr Code nicht mit einer späteren Assembler-Version brechen, die SSE-Unterstützung enthält.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen