Autor Thema: Assembler + C  (Gelesen 5530 mal)

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« 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;
}

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 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.
*post*

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #2 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.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 04. December 2005, 19:26 »
Hmm, gibt es ESI? ^^
*post*

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #4 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.....

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. December 2005, 19:41 »
mit zweiter operand ist der ganze ausdruck hinter dem komma gemeint, denke ich

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #6 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.
db 0x55AA

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 04. December 2005, 20:10 »
wie kann ich trotzdem die speicherstelle auslesen?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 04. December 2005, 20:12 »
mov ax, [addresse_der_speicherstelle]

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #9 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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 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
In the Future everyone will need OS-64!!!

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #11 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;
    }

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 04. December 2005, 21:17 »
senden will

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #13 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!
db 0x55AA

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 04. December 2005, 22:17 »
o.k. dann wart ich mal

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 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.
In the Future everyone will need OS-64!!!

 

Einloggen