Undefinierter Verweis auf 'esp'

Jimmy Suh

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?

paxdiablo

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 espist 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, xmm0bevor 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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv