Register _EAX, _ECX, _EDX
-
Hi,
im PC habe ich eine neue PCI-Karte installiert und versuche diese nun im DOS-Modus zu erkennen. Dafür muss ich auf die PCI-BIOS-Funktionen (PCI_BIOS_PRESENT, FIND_PCI_DEVICE, READ_CONFIGURATION_BYTE, WRITE_CONFIGURATION_BYTE ...) zugreifen. Dafür müssen bestimmte Daten in die Register des Prozessors geschreiben werden.
Der Zugriff auf die Register _AX, _BX, _CX, _DX, _SI und _FLAGS klappt ohne Probleme. Will ich auf die Register _EAX, _ECX, _EDX zugreifen, bekomme ich die Fehlermeldung "Undefined symbol"
Woran kann das liegen, was muss ich ändern?
Ich verwende den Borland C++ 3.1 Compiler und arbeite im DOS-Modus.
Danke im voraus
Arne HückelHier das verwendete Programm:
#include <dos.h>
#include <stddef.h>
#include <stdio.h>main()
{
unsigned long pci_signature; /* PCI Signature ('P', 'C', 'I', ' ') /
unsigned short al, ah, / Temporary variables to hold register values */
bl, bh, bx,
cl, ch,
flags;/* Load entry registers for PCI BIOS */
_AH = 0xb1;
_AL = 0x01;/* Call PCI BIOS Int 1Ah interface */
geninterrupt(0x1a);/* Save registers before overwritten by compiler usage of registers */
al = _AL; ah = _AH;
bl = _BL; bh = _BH; bx = _BX;
cl = _CL; ch = _CH;
pci_signature = _EDX;
flags = _FLAGS;/* Check bytes in pci_signature for PCI Signature */
if ((pci_signature & 0xff) == 'P' &&
((pci_signature >> & 0xff) == 'C' &&
((pci_signature >> 16) & 0xff) == 'I' &&
((pci_signature >> 24) & 0xff) == ' ')
{/* Indicate to caller that PCI bios present */
printf ("\n\nPCI-BIOS present.");/* Extract calling parameters from saved registers */
printf("Hardware mechanism: %w", &al);
printf("\nInterface Level Version: %w", &bx);
printf("\nNumber of PCI-BUS: %w", &cl);
printf("\nPCI-signature: %w", &pci_signature);
}}
-
jou, Borland C++ 3.1 kennt 32 bit-regs leider nicht (das problem habe ich auch macnhcmal, da ich auch BC++3.1 verwende) du kannst es allerdings auf eine andere art machen, indem du einfach mit __emit__ (...) direkte op-codes einfügst. dazu nimmst du am besten erstmal einen debugger (TurboDebugger 5.5: [url=http://jungle.brock.dk/pho/upload\turbodebugger.exe)]http://jungle.brock.dk/pho/upload\turbodebugger.exe)[/url] und schaust dir die op-codes von der gewünschten instruktion an. die kannst du dann in __emit__ () einsetzen. z.b. kannst du
Mov EAx,1
so formulieren:
__emit__ (0xB8, 0x01, 0x00, 0x00, 0x00);
(0xB8 is der opcode für Mov EAx,value)
bitte beachte aber, dass __emit__ nicht bestandteil von C++ ist und somit nur unter den Borland-Compilern geht
cu todo
-
Danke fuer die schnelle Antwort!!! Habe bereits die Turbodebugger.exe heruntergeladen aber bisher noch nicht wirklich Informationen zu den instruktionen fuer meine Anwendung gefunden.
Der Hersteller der eingebauten PCI-Karte (es handelt sich um eine Multi-E/A-Messkarte von der Firma Meilhaus) hat ein Beispielprogramm fuer den DOS-Modus und den Borland C++ 3.1 Compiler mitgeliefert, in dem die Registerbefehlen _EAX, _ECX, _EDX verwendet werden. Ausserdem habe ich im Internet ein Programm fuer den DOS-Modus und Borland C++ 3.1 mit denselben Registerbefehlen gesehen.
Der Kartenhersteller meint, dass es daran liegen koennte, dass der Compiler nicht auf 386 Befehle eingestellt ist. Kann das sein? Und wenn ja, weiist du wo man den Compiler auf 386 Befehle umstellen kann?
ciao arne979
-
Verschoben nach "Andere Compiler".
-
ich hab doch schon mal gesagt, das BC++3.1 keine 32-bit-regs kennt. DAS GEHT EINFACH NICHT!!! das steht selbst in der hilfe. du kannst da nix umstellen! ich hab da selber schon alles durchgecheckt!
cu todo