AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inline Assembler C++ -> Delphi

Ein Thema von scp · begonnen am 23. Okt 2004 · letzter Beitrag vom 22. Dez 2009
Antwort Antwort
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
nanix
(Gast)

n/a Beiträge
 
#2

Re: Inline Assembler C++ -> Delphi

  Alt 22. Dez 2009, 12:13
Hello

can we also get PCI device capabilites?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz