Einzelnen Beitrag anzeigen

scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#1

Inline Assembler C++ -> Delphi

  Alt 23. Okt 2004, 19:04
Habe mich an dieser Funktion festgebissen. Weis jemand, wie man diesen Code korrekt in Delphi übersetzt?
Code:
ULONG bios32_call;

void bios32_scan_pci_entry(void)
{
        ULONG  cseg_size, offset, base_addr;

        /* call the BIOS32 BSD for the PCI address
           BSD calls terminate in RETF not RET */

        /* eax is loaded with "$PCI" magic */
        asm("movl      $0x49435024, %%eax\n"
                "xorl  %%ebx, %%ebx\n"
                "movl  _bios32_call, %%ebp\n"
                "pushl %%cs\n"
                "call  %%ebp\n"
                : "=c" (cseg_size),
                  "=d" (offset),
                  "=b" (base_addr)
                :
                : "eax", "ebx", "ecx", "edx", "ebp", "memory" );

        /* setup two new selectors of pci_code32, pci_data32, etc. */
}
Hier mein Versuch, ist aber alles andere als funktionstüchtig, habe kaum Ahnung von asm:
Delphi-Quellcode:
var
  bios32_call: LongWord;

function bios32_scan_pci_entry(serviceID : LongwORD) : Tbios32_scan_pci_entry_result;
  function bios32_scan_pci_entryHelper : Tbios32_scan_pci_entry_result; assembler; register;
  asm
    PUSH EBX {Save affected register}
    PUSH EDI
    MOV EDI,EAX {@Result}

    mov EAX,serviceID
    xor ebx,ebx
    mov ebp,bios32_call
    push cs
    call ebp
    
    STOSD {cseg_size}
    MOV EAX,EBX
    STOSD {offset}
    MOV EAX,ECX
    STOSD {base_addr}
    MOV EAX,EDX
    POP EDI {Restore registers}
    POP EBX
  end;
begin
  result := bios32_scan_pci_entryHelper;
end;
bios32_call ist ein Double Word Wert, der über eine andere Funktion ermittelt wird. Er stellt einen Zeiger auf eine BIOS-Funktion dar.
Da stellt sich übrigens eine zweite Frage: Kann man unter NT (besonders WinXP SP2) überhaupt eine Funktion aus dem "Speicherbereich" 0x000E0000 bis 0x00100000 aufrufen/ausführen?

Ach ja: Hier ist übrigens die Seite, in der der Originalcode beschrieben ist.
  Mit Zitat antworten Zitat