Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Assembler ::  Ram Speicher auführen  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
SpR
Unregistrierter




Beitrag SpR Unregistrierter 17:52:38 26.04.2012   Titel:              Zitieren

Durchausmöglich , merkwürdig ist nur , das der von Visul Atudio inline asm erstellte code läuft un der von nasm nicht^^
rkhb
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.09.2010
Beiträge: 204
Beitrag rkhb Mitglied 18:11:46 26.04.2012   Titel:              Zitieren

SpR schrieb:
Durchausmöglich , merkwürdig ist nur , das der von Visul Atudio inline asm erstellte code läuft un der von nasm nicht^^

NASM oder FASM? Das sind zwei verschiedene Assembler! Aber der von Dir Dir gepostete Problemcode gehört doch zum Inline-Assembler von VC++. :confused:

Ich kann Dein Problem hier immer noch nicht reproduzieren. Versuch mal folgende Kombination:

Assembler:
1
2
3
4
5
6
7
8
9
10
11
format MS COFF
public _MyFunc
SECTION '.text' code readable executable
_MyFunc:
    push ebp
    mov ebp, esp
    mov eax, [ebp+8]
    mov ebx, 1000
    add [eax], ebx
    pop ebp
    ret


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
extern "C" void MyFunc(int*);
 
int main()
{
    int VarToChange = 1000;
    cout << "VarToChange=" << VarToChange << endl;
 
    MyFunc (&VarToChange);
    cout << "VarToChange=" << VarToChange << endl;
 
    _asm
    {
        lea eax, VarToChange
        push eax
        call MyFunc
        add esp, 4
    }
    cout << "VarToChange=" << VarToChange << endl;
 
    return 0;
}


Diese Kombination sollte klappen. Die FASM-Funktion addiert immer 1000 zur übergebenen Variable. Beachte, dass man bei der C-Calling-Convention den Stack selbst aufräumen muss (Zeile 18 der C++-Datei).

viele grüße
ralph
sk0r
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.11.2008
Beiträge: 63
Beitrag sk0r Mitglied 16:53:11 28.04.2012   Titel:              Zitieren

SpR schrieb:

push ebp
mov bp,sp
mov ax,word ptr [di+8]
mov bx,64h
add byte ptr [eax],al
add word ptr [bx+si],bx
pop bp
ret


Sollte möglichst was korrumpieren.
Um aber dir alles sagen zu können müsstest du schon mal
dein komplettes Disassembly posten. ;)
Ausserdem 16Bit mit 32Bit kram zu mischen ist auch nicht so toll.

Warum benutzt du nicht MASM32 ?

Auch unter Win7 kann man Software Interrupts benutzen,
sofern du dich im Kernelmodus "befindest".

PS: Du kannst auch direkt IASM verwenden:

Code:
__declspec(naked) BLA CALLINGBLA name(BLUB)
{
    __asm {
 
        ret
    }
}


Zuletzt bearbeitet von sk0r am 16:59:25 28.04.2012, insgesamt 2-mal bearbeitet
TASM
Unregistrierter




Beitrag TASM Unregistrierter 15:59:31 30.04.2012   Titel:              Zitieren

Warum benutzt du nicht die HL-Syntax von MASM? Ist doch viel bequemer.
Merke: ESI, EDI, EBX müssen vor Ende der Subfunktion wieder auf die Werte vor dem Aufruf zurückgestellt werden (Push/Pop)
MASM-Beispiel: \MASM32\datetime\CopyDateTime.asm

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 .486                      ; create 32 bit code
    .model flat      ; 32 bit memory model
    option casemap :none      ; case sensitive
    MyFunc PROTO C :DWORD
 
myval equ 1234
 
MyFunc proc C uses ebx edi esi myvar:DWORD
    mov eax,myvar
    mov [dword ptr eax],myval
 
;oder:
;   add dword ptr [eax],myval
;oder:
;   mov ebx,myval
;   sub dword ptr [eax],ebx
    ret
MyFunc endp
 
end
SpR
Unregistrierter




Beitrag SpR Unregistrierter 20:32:50 25.05.2012   Titel:              Zitieren

Tut mir leid wegen dem pop ebp und pop ebp habe ich leider vergessen ich benutze nasm als Assembler. Das Problem hat sich schon geklärt. Vielen Dank für die Antworten konnte in diesem Fall viel lernen.
c++.de :: Assembler ::  Ram Speicher auführen  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.