Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: nameac am 04. December 2005, 18:53

Titel: Assembler + C
Beitrag 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;
}
Titel: Assembler + C
Beitrag von: Legend am 04. December 2005, 19:05
Wie lautet diese Fehlermeldung?
Hmm, du willst wohl auf die Speicherstelle ds:si zugreifen. Ich glaub dann müssen eckige Klammern drum.
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 19:17
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.
Titel: Assembler + C
Beitrag von: Legend am 04. December 2005, 19:26
Hmm, gibt es ESI? ^^
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 19:35
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.....
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 19:41
mit zweiter operand ist der ganze ausdruck hinter dem komma gemeint, denke ich
Titel: Assembler + C
Beitrag von: Osbios am 04. December 2005, 20:01
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:
Zitat
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.
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 20:10
wie kann ich trotzdem die speicherstelle auslesen?
Titel: Assembler + C
Beitrag von: SSJ7Gohan am 04. December 2005, 20:12
mov ax, [addresse_der_speicherstelle]
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 20:20
mov ax,[0ffffh:0eh]
mov ax,[$0ffffh:$0eh]
mov ax,[$0ffff:$0e]

geht alles nicht ich benutze als compiler msvc 6.0
Titel: Assembler + C
Beitrag von: bitmaster am 04. December 2005, 20:45
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
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 21:15
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;
    }
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 21:17
senden will
Titel: Assembler + C
Beitrag von: Osbios am 04. December 2005, 22:10
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!
Titel: Assembler + C
Beitrag von: nameac am 04. December 2005, 22:17
o.k. dann wart ich mal
Titel: Assembler + C
Beitrag von: bitmaster am 04. December 2005, 22:34
Zitat von: Osbios
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.