Borland x86 inline-assembler ist, erhalten eine label-Adresse?

Ich bin mit Borland Turbo C++ mit einigen inline-assembler-code, so dass vermutlich der Turbo Assembler (TASM) Art Assembler-code. Ich möchte Folgendes tun:

void foo::bar( void )
{
    __asm
    {
      mov eax, SomeLabel
      //...
    }
    //...
SomeLabel:
    //...
}

Also die Adresse von SomeLabel, wird in EAX. Dies funktioniert nicht und der compiler meckert: Undefined symbol "SomeLabel'.

In Microsoft Assembler (MASM) beschrieben, das dollar-symbol ($) dient der aktuellen Position-Zähler, das wäre nützlich für meine Zwecke. Aber auch dies scheint nicht zu funktionieren, in Borland Assember (Ausdrucks-syntax-Fehler).

Update: ein bisschen konkreter, ich brauche den compiler generiert die Adresse, bewegt es sich in eax als eine Konstante bei der Kompilierung/Verlinkung und nicht zur Laufzeit, so wird es zu kompilieren, wie "mov eax, 0x00401234".

Kann jemand empfehlen, wie man diese arbeiten?

UPDATE: Antworten auf Pax die Frage (siehe Kommentar), Wenn die Basis-Adresse wird zur Laufzeit geändert durch den Windows-loader die DLL/EXE PE Bild wird noch verschoben werden, indem Sie die Windows-Ladeprogramm und die Etiketten-Adresse gepatcht werden, die zur Laufzeit vom loader zu verwenden, die re-basiert-Adresse, so dass die Verwendung eines Compiler - /link-Zeit-Wert für den label-Adresse ist nicht ein Problem.

Vielen Dank im Voraus.

  • Funktioniert das, wenn Sie definieren SomeLabel innerhalb der asm-block?
  • für gcc, immer eine Etiketten-Adresse ist "&&label", haben Sie es ausprobiert? vielleicht klappt es bei borland auch?
  • Wie genau wollen Sie, um den Wert zur compile-Zeit? Der loader kann sich ändern (zur Ladezeit, lange nach Links) die Adresse, an der dieser code wird geladen, so dass Sie Ihren Compiler - /link-Wert nutzlos.
  • Vielleicht müssen Sie nochmals die Frage: was GENAU willst du mit eax, sobald es geladen ist.
  • paxdiablo: Die Windows-PE-loader zu verlagern, eine exe-Datei und Prozess der PE-Dateien .reloc Abschnitt aktualisieren von einer festen Adresse mit der neu geladenen base-Adresse, damit EAX würde immer richtig sein. Auch sollte es nicht, egal was ich tun werde mit EAX, sobald es geladen ist, die Frage ist, wie setzen EAX die Adresse SomeLabel (was leicht möglich ist, in MSVC einfach nicht C++ Builder).
InformationsquelleAutor QAZ | 2008-10-16
Schreibe einen Kommentar