Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nameac am 04. December 2005, 18:53
-
hallo kann mir jemand sagen was ich falsch gemacht habe
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
WORD Get()
{
WORD value3 = 0;
DWORD value4 = 0;
__asm
{
mov ax,0ffffh
mov ds,ax
mov si,0eh
mov ax,ds:si //aufgrund dieser zeile bekomme ich eine
fehlermeldung
mov value3,ax
}
double inhalt=value3;
return (WORD)inhalt;
}
int main(int argc, char* argv[])
{
printf("%i",(int)Get());
return 0;
}
-
Wie lautet diese Fehlermeldung?
Hmm, du willst wohl auf die Speicherstelle ds:si zugreifen. Ich glaub dann müssen eckige Klammern drum.
-
die klammern hatte ich im ursprünglichen quelltext schon mal gesetzt
fehlermeldung:
D:\c_progs\prog_1\prog_1.cpp(17) : error C2432: Unzulaessiger Verweis auf 16-Bit-Daten in 'Zweiter Operand'
Fehler beim Ausführen von cl.exe.
-
Hmm, gibt es ESI? ^^
-
richtig ich möchte die speicher stelle auslesen, aber dazu brauch ich kein 32 bit großes index register
wäre schön wenn du mir trotzdem helfen könntest denn was meinst du mit
gibt es.....
-
mit zweiter operand ist der ganze ausdruck hinter dem komma gemeint, denke ich
-
Ich weiß ja nicht was das für ein Inlineassembler ist, kenne jedoch nur diese beiden Schreibweisen:
mov ax,[ds:si]
mov ax,ds:[si]
Und nach der Meldung zu urteilen ist das ein 32bit Prog. Da funktioniren 16 Adressen dann natürlich nicht.
In der MSDN steht:A 16-bit register is used as an index or base register. The compiler does not support referencing 16-bit data. 16-bit registers cannot be used as index or base registers when compiling for
32-bit code.
http://msdn2.microsoft.com/library/5zyca2kh.aspx
Damit dürfte das geklärt sein.
-
wie kann ich trotzdem die speicherstelle auslesen?
-
mov ax, [addresse_der_speicherstelle]
-
mov ax,[0ffffh:0eh]
mov ax,[$0ffffh:$0eh]
mov ax,[$0ffff:$0e]
geht alles nicht ich benutze als compiler msvc 6.0
-
ersetzte mal das:
mov ax,ds:si
durch einen von diesen:
mov ax,[ds:si]
mov ax,ds:[si]
mov eax,[ds:esi]
mov eax,ds:[esi]
Wies jetzt garnicht ob der Wert bei 32-Bit in ax oder in dem höheren Teil von eax ist. Eventuell ror eax,16
-
danke das gibt zumindest keine fehlermeldung mehr, allerdings wenn ich prog starte kommnt eine msgbox und fragt mich ob ich die fehlermeldung
double Get()
{
WORD value3 = 0;
DWORD value4 = 0;
__asm
{
mov ax,0ffffh
mov ds,ax
mov si,0eh
mov eax,ds:[esi]
mov value4,eax
}
double inhalt=value4;
return inhalt;
}
-
senden will
-
Sacht ma könta alle ken Englisch?
Du benutzt einen Compiler der nur 32Bit Code erzeugt.
Wenn du eine 32bit Adresse benutzt (ESI) dann muss in DS ein gültiger Descriptor stehen und keine Adresse.
REALMODE <> PROTECTEMODE
Ich glaube Dir das heute Abend alles zu erklären übersteigt jetzt meine Nerven und meine Zeit. Ich versuch das nochmal später alles zu erleutern. *schreibmerkzettel*
Nacht!
-
o.k. dann wart ich mal
-
Sacht ma könta alle ken Englisch?
Oh, habe die Meldung nicht gelesen. Ja, stimmt der brauch Deskriptore. Das was du benötigst ist ein Compiler, der Real-Mode Programme erzeugt (1 MByte hihi). Im PM kannst du nicht einfach jede beliebige Adresse auslesen oder sogar beschreiben.