Assembler unter VS 6 im C++-Code
-
Hallo zusammen !
Wie und mit welchen Befehlen kann ich direkt in meinem C++-Prog ein Assemblercode implementieren?
Danke und Gruß MacReeg
-
__asm mov ax,1 oder __asm { mov ax,1 }
-
Danke Nemesyzz !
Aber wie rufe ich diesen Assembler-Code aus meinem C++-Prog auf?
Gruß MacReeg
-
Stetdoch eigentlich schon da:
z.B:
void outport(unsigned short port, unsigned short val)
{
_asm
{
mov dx, port
mov ax, val
out dx, ax//nicht unter NT
}
}gibt etwas an einen bestimmten Port aus
-
OK TheBigW !
Das habe ich nun kapiert. Mit Port und Val kann ich also Werte an den ASM-Code übergeben. Aber wie gebe ich nun Port oder Val wieder an mein C++-Prog zurück?
Gruß MacReeg
-
Mit Port und Val kann ich also Werte an den ASM-Code übergeben
nein da wird nichts übergeben!
void function(void) { int a = 9; int b = 4; printf("%d -- %d\n", a, b); __asm { // verändere a und b werte } printf("%d -- %d\n", a, b); }
-
Hallo Franz !
Danke für die schnelle Hilfe - der ASM-Source funktioniert nun unter meinem C++-Prog. Bei Deinem Beispiel gab es nur ein Problem mit der Datentypgröße. Da a und b von der Größe her int (also 4 Bytes) groß sind und die Register nur, ohne Aufsplittung auf 2 Register, mit 2 Bytes funktionieren.
Gruß MacReeg
-
Ok,Ok !
Bisher war alles klar, aber irgendwann kommt man zu einem Punkt, da muss man einfach fragen. Wie sieht z.B. der ASM-Code unter VS6 aus, wenn ich ein einfaches Byte-Array mit einer Zahl füllen möchte?
Siehe Beispiel:
int _tmain(int argc, _TCHAR* argv[]) { char Array[10] = {0,1,2,3,4,5,6,7,8,9}; unsigned short Laenge = sizeof(Array); for (int x = 0; x < Laenge; x++) cout << (int)Array[x]; _asm { ...? ; das Array soll z.B. mit nur Einsen gefüllt werden } for (int x = 0; x < Laenge; x++) cout << (int)Array[x]; return 0; }
Gruß MacReeg
[ Dieser Beitrag wurde am 29.08.2002 um 17:36 Uhr von MacReeg editiert. ]
-
wiso machst du ein char Array wenn du ihn nacher mit Zahlen füllst ??
egal.
Naja ich glaub in diesem Forum wirst du nicht so viel glück haben muste mal bei Assambler fragen.
-
Würde ich auch sagen ... Hat ja nix mehr mitder MFC zu tun ...
Verschoben.
-
__asm{ xor ebx,ebx //bei [0] anfangen Loop0: mov [byte ptr Array+ebx],01h inc ebx //ebx++ cmp ebx,0000000Ah //ebx mit 10 vergleichen jb Loop0 //wenn ebx<10, zurueckspringen };
Das sollte die gesamte Array mit 1en fuellen...
P.S.:
Wenn jemand weiss, wie man im VC ein Variablen-Offset an einen Register uebergeben kann, bitte mal posten.
(sowas wie im NASM "mov ebx,Var" oder im TASM/MASM "mov ebx,offset Var")
-
die Sache ist an sich simpel, ein Array ist im Prinzip nur ein Zeiger, auf eine Folge von Daten. Der Compiler bestimmt dann abhängig vom zugeordneten Typ den Zugriff (hört sich bescheiden an, was¿).
du kannst also:
meinTyp a,Array[m] ... a=Array[n] ...
auch so schreiben:
meinTyp a, *Array ... a= *(Array+n*sizeof(meinTyp)) ...
Für den Compiler ist beides das gleiche, ausser, dass der Speicher bei der oberen Variante bereits statisch allokiert wurde (wenn man m wegläßt ist es exakt das gleiche)
//ich sehe gerade Nobuo T hat was geschrieben, kann man aber noch optimieren *g*
__asm{
les edi, byte ptr Array //läd den Zeiger auf dein Array in es:edi
mov ecx, 10 //dezimal bitte
mov al, 1 //die Zahl die du speichern möchtest
rep stosb //und speichern
};
-
Danke Leute für die Hilfe !
-
@-bg- :
Hast Du deinen eigenen Code ueberhaupt vorher schonmal im VC++6 getestet?
Die LES-Instruktion laedt einen Pointer, aus der angegebenen Speicheraddresse und nicht die Addresse der angegebenen Variable.
D.h. es:edi enthaelt nach dieser Aktion die Werte 03020100:0504. (wenn Die Array mit 0,1,2... usw. initialisiert wurde)
=>Das Programm stuerzt bei der LES-Instruction einfach ab.Als Faustregel kannst Du dir hierzu merken, dass man in Win32-Programmen die Segmentregister am besten in Ruhe lassen sollte, dann wird die Gefahr eines Absturzes um einiges geringer
[ Dieser Beitrag wurde am 30.08.2002 um 19:04 Uhr von Nobuo T editiert. ]
-
Sorry, hab kein VCxy. Bin normalerweise auch nur nasm Syntax gewohnt und hätte da jez auch glatt wieder in die HelpFile geschielt *g*.
Aber du hast recht, man müsste in diesem Fall echt keine neuen Daten ins ES laden, da es wohl nur ein DatenSegment gibt.
mfg
-bg-