Not logged in. · Lost password · Register

MatthiasM
Avatar
Member since Nov 2003
459 posts
Subject: 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)
Der Computer ist ein mechanischer Hohlkopf.
Antipythagoras
Siff-Lord
Avatar
Member since Feb 2003
585 posts
by reference

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;
    }
}
semptex, c4, dünger, duschgel, deoroller, muttermilch, diet coke, mentos, Bombe, Atombombe, Uran, Anreicherung, Terror, Tote, Anschlag, Zug, Gleis, Chaos, Heil, Sturz, Anschlag, Flüssigsprengstoff, mischen, Rache, Heilig, Krieg, Gott, Feinde, Sprengstoff, Reinigungsmittel, TATP, Anleitung, Pinsellösung, Säure, Backpulver, NH4NO3, Ammoniumnitrat, Kanzleramt, Flug, Kontrolle, Waschmittel
MatthiasM
Avatar
Member since Nov 2003
459 posts
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 :(

Noch irgendwelche Ideen?
Der Computer ist ein mechanischer Hohlkopf.
Antipythagoras
Siff-Lord
Avatar
Member since Feb 2003
585 posts
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
semptex, c4, dünger, duschgel, deoroller, muttermilch, diet coke, mentos, Bombe, Atombombe, Uran, Anreicherung, Terror, Tote, Anschlag, Zug, Gleis, Chaos, Heil, Sturz, Anschlag, Flüssigsprengstoff, mischen, Rache, Heilig, Krieg, Gott, Feinde, Sprengstoff, Reinigungsmittel, TATP, Anleitung, Pinsellösung, Säure, Backpulver, NH4NO3, Ammoniumnitrat, Kanzleramt, Flug, Kontrolle, Waschmittel
MatthiasM
Avatar
Member since Nov 2003
459 posts
Stimmt, das läuft! Aber es muss doch noch eine 'offizielle' Methode geben, die weniger Befehle braucht?
Danke im Voraus!
Der Computer ist ein mechanischer Hohlkopf.
Antipythagoras
Siff-Lord
Avatar
Member since Feb 2003
585 posts
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
    }
}
semptex, c4, dünger, duschgel, deoroller, muttermilch, diet coke, mentos, Bombe, Atombombe, Uran, Anreicherung, Terror, Tote, Anschlag, Zug, Gleis, Chaos, Heil, Sturz, Anschlag, Flüssigsprengstoff, mischen, Rache, Heilig, Krieg, Gott, Feinde, Sprengstoff, Reinigungsmittel, TATP, Anleitung, Pinsellösung, Säure, Backpulver, NH4NO3, Ammoniumnitrat, Kanzleramt, Flug, Kontrolle, Waschmittel
This post was edited on 2005-03-17, 08:57 by Antipythagoras.
Antipythagoras
Siff-Lord
Avatar
Member since Feb 2003
585 posts
Ach ja,. noch zu
Ich bin mir ziemlich sicher, dass das was ich mache by reference heißt, weil ich einen Verweis übergebe, keinen Wert

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);
semptex, c4, dünger, duschgel, deoroller, muttermilch, diet coke, mentos, Bombe, Atombombe, Uran, Anreicherung, Terror, Tote, Anschlag, Zug, Gleis, Chaos, Heil, Sturz, Anschlag, Flüssigsprengstoff, mischen, Rache, Heilig, Krieg, Gott, Feinde, Sprengstoff, Reinigungsmittel, TATP, Anleitung, Pinsellösung, Säure, Backpulver, NH4NO3, Ammoniumnitrat, Kanzleramt, Flug, Kontrolle, Waschmittel
MatthiasM
Avatar
Member since Nov 2003
459 posts
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) ?!?
Der Computer ist ein mechanischer Hohlkopf.
Antipythagoras
Siff-Lord
Avatar
Member since Feb 2003
585 posts
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.
semptex, c4, dünger, duschgel, deoroller, muttermilch, diet coke, mentos, Bombe, Atombombe, Uran, Anreicherung, Terror, Tote, Anschlag, Zug, Gleis, Chaos, Heil, Sturz, Anschlag, Flüssigsprengstoff, mischen, Rache, Heilig, Krieg, Gott, Feinde, Sprengstoff, Reinigungsmittel, TATP, Anleitung, Pinsellösung, Säure, Backpulver, NH4NO3, Ammoniumnitrat, Kanzleramt, Flug, Kontrolle, Waschmittel
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen