| Autor |
Nachricht |
SpR
Unregistrierter
|
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
|
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++.
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
|
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
|
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
|
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. |
|
|
|
 |
|
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.
|
|
|
|
|