by reference und assembler

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

by reference und assembler
des funktioniert net:

void SetToZero(long *v)
{
_asm
{
mov eax, v;
xor eax, eax;
mov v, eax;
}
}

v bleibt unverändert. Weiß jemand, wie es heißen muss?
(der code ist für Visual C++ 5.0)


was du da machst ist „by value“.
Also du nullst den Pointer.

Wenn der InlineAsm ähnlich zum Masm funzt, sollte das gehen:
void SetToZero(long *v)
{
_asm
{
mov eax, *v;
xor eax, eax;
mov *v, eax;
}
}

Ansonsten versuch mal:
void SetToZero(long *v)
{
_asm
{
mov eax, [v];
xor eax, eax;
mov [v], eax;
}
}


Ich bin mir ziemlich sicher, dass das was ich mache by reference heißt, weil ich einen Verweis übergebe, keinen Wert. In VisualBasic zum Beispiel benutzt man dafür ‘ByRef’, was ja by reference heißt.

*v gibt Fehler und [v] hat keinen Effekt :frowning:

Noch irgendwelche Ideen?


OK, dann halt Holzhammerindirektion:

#include <stdio.h>
#include <stdlib.h>

void settozero(int *v){
_asm{
mov ebx, v
mov eax, DWORD PTR [ebx + 0]
xor eax, eax
mov DWORD PTR [ebx + 0], eax
}
}

void main(){
int i= 529380;
settozero(&i);
printf(“%d\n”, i);
}

Das läuft bei mir unter VC 6.0


Stimmt, das läuft! Aber es muss doch noch eine ‘offizielle’ Methode geben, die weniger Befehle braucht?
Danke im Voraus!


Ich dachte immer I386 kann von jeder Adresse indirekt Pointern
Wäre dann anstelle von
mov eax, DWORD PTR [ebx + 0]

etwa:

mov eax, DWORD PTR [v + 0]

Aber das hat ja nicht gefunzt (bei VC 6.0).
Villeicht ist einfach nur der M$_Assembler zu :#: :#: :motz: :vogel:

Wenn du ne kurze Lösung suchst:

void settozero(int *v){
    _asm{
        mov        ebx, v
        mov        DWORD PTR [ebx + 0], 0
    }
}

Ach ja,. noch zu

Ja schon. Aber du nullst nicht die Daten auf die der Pointer zeigt, sondern (wie gesagt) den Pointer selbst. Du benutzt also die POINTER VARIABLE by Value (und nicht by Reference).

Wenn du es nicht glaubst füg mal ungefähr sowas über und unter den _asm{} -Teil ein:
printf(„%d\n“, (int) v);
oder (lustig, weil SigSegV)
printf(„%d\n“, *v);


Ach so, du meinst was ich mit dem Pointer mache. Ich meine die Übergabe im Prozedurrumpf ist by reference.

Ich habe die Frage in zwei C Foren gepostet, aber bis jetzt hat noch niemand geantwortet. Aber stimmt, mit den zwei Zeilen geht es auch ganz gut :gun:
Allerdings unterstützt VC auch Wertzuweisungen an Variablen (nicht nur an Register).

Also z.B. mov a, 10;

Es gibt doch bestimmt eine Schreibweise, die man anwendet, wenn a ein pointer ist (in einer Zeile) ?!?


das Problem ist die Indirektion.
Du willst ja nicht in die Variable schreiben, sondern an die Adresse, die in der Variable steht. Wenn der x86 oder das VC nicht über jede Speicherstelle die Indirektion auflösen kann, dann gehts nur so.