problema release mode

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
msmihai
Junior
Junior
Posts: 6
Joined: 11 Jan 2008, 01:53

problema release mode

Post by msmihai » 11 Jan 2008, 09:47

Am urmatorul program pe care vreau sa il compilez in release mode

Code: Select all

#include <stdio.h>
#include <string.h>

void ceva(int*,int)
{
    printf("Am intrat\n");
    _asm
    {
        mov eax,[ebp+12]
        mov ebx,[ebp+8]
        //mov ecx,[ebx]
    }
    printf("Am iesit");


}

int main()
{
    int sir[10],lungime;
    lungime=10;
    sir[0]=13333;sir[1]=233333;
    ceva(sir,lungime);
    getchar();
    return 0;
}
Se pare totusi ca la linia "mov ecx,[ebx]", programul crapa ( de asta l-am pus in comentariu ) . De ce se intampla acest lucru ?



User avatar
Zeros
Membru
Membru
Posts: 54
Joined: 12 Jul 2007, 12:34
Location: Waslooy

Re: problema release mode

Post by Zeros » 11 Jan 2008, 11:09

Nu sint specialist in asamblare asa ca iti dau un raspuns babaeste: probabil ca incerci sa accesezi ceva "garbage" iar compilatorul e destul de destept sa-ti genereze cod care arunca o mica exceptie (am incercat si pe VS6.0 iar acela n-are nimic de ciriiit, pe cind VS2008... ohoooo!).

BTW. La ce-ti trebuie acel cod aparent fara nici un rost? Ceva virusaki? :) ;)
Poate daca ne explici exact ce vrei sa faci ne prindem si noi ce se intampla.
Deocamdata nu se vad decit niste instructiuni asm aruncate la intimplare.
V-am pupat! :-)

msmihai
Junior
Junior
Posts: 6
Joined: 11 Jan 2008, 01:53

Re: problema release mode

Post by msmihai » 11 Jan 2008, 11:13

daca nu pot compila un program cu niste instructiuni aruncate la intamplare, cum m**a sa ma mai apuc de ceva serios ? :yahoo:

eu deja am programul facut, dar am vazut ca nu merge. asa ca am luat un caz micut, ca acesta, sa constat ca de fapt problema mea e de aici .

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: problema release mode

Post by Ovidiu Cucu » 11 Jan 2008, 11:29

msmihai wrote:daca nu pot compila un program cu niste instructiuni aruncate la intamplare, cum m**a sa ma mai apuc de ceva serios ?
De compilat vad ca se compileaza, deci nu la compilare e problema ta. Un program C/C++ (mai ales cu "floricele" ASM prin el), daca se compileaza cu succes nu-i obligatoriu sa si mearga corect.
msmihai wrote:eu deja am programul facut, dar am vazut ca nu merge. asa ca am luat un caz micut, ca acesta, sa constat ca de fapt problema mea e de aici .
Offfff!... De shpe ani de programare sunt satul de programe "gata facute" din astea. :wacko:
Asa cum a sugerat si Zeros, incearca mai intai sa intelegi "ce face". N-ai sa treci niciodata de hop daca te limitezi la a observa "ce se intampla".

msmihai
Junior
Junior
Posts: 6
Joined: 11 Jan 2008, 01:53

Re: problema release mode

Post by msmihai » 11 Jan 2008, 11:46

in ce sens gata facute? m-am pus in cap aseara sa scriu programul in asm, ca doar sunt incepator, am vazut ca nu merge, am luat un exemplu cu mai putin cod, am vazut unde e eroare, am intrebat de ce se intampla, mi s-a dat raspunsul la intrebare pe forum, acum merge.
Problema la mine e ca nu merge in release mode ... si pun pariu ca are legatura cu secventa aia in asm ... mai exact, cred ca release mode-ul modifica stiva intr-un anumit mod si asta provoaca acel crash . Ce se intampla exact, habar n-am . Dar , intuitiv, eu zic ca asta se intampla.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: problema release mode

Post by neagu_laurentiu » 11 Jan 2008, 11:59

De ce se intampla acest lucru ?
1) Daca pe Release setezi compilatorul sa nu mai faca optimizari ai sa vezi ca nu mai da eroare.
2) Ruleaza diferite variante compilate ale programului tau cu un debugger profesionist (Ollydbg, W32DASM, etc.) si ai sa vezi ce se intampla la nivel low.
In varianta cu eroare (Release cu optimizare) se acceseaza zone de memorie FFFFFFFF inexistente spere deosebire de celelate variante (codul asm difera de la o versiune la alta).
3) Tu muti in registri niste valori din adrese de memorie plecand de la deplasamentul aflat in registrul EBP+ceva, care, surpriza, :reallymad: nu stii ce valoare are, adica nu l-ai initializat

Code: Select all

MOVE ECX, DWORD PTR DS:[EBX] 
[/b]

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: problema release mode

Post by neagu_laurentiu » 11 Jan 2008, 12:07

Cand mixezi C/C++ cu asm asigura-te ca registrii au valori ce-ti folosesc la ceva, altfel nu stii ce a facut C/C++ inaintea asm-ului tau sau de ce a pastrat C++ acolo ceva pentru a folosi mai tarziu.

msmihai
Junior
Junior
Posts: 6
Joined: 11 Jan 2008, 01:53

Re: problema release mode

Post by msmihai » 11 Jan 2008, 12:14

asta da raspuns :yes:
intr-adever, fara optimizari merge bine. multumesc mult.

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: problema release mode

Post by Dragos Cojocari » 11 Jan 2008, 12:34

Porblema e ca in mod release functia ta nu mai e functie. :) Compilatorul isi flexeaza muschii si o expandeaza inline. Ca atare [ebp] nu indica spre stiva functiei "ceva" asa cum te astepti tu ci spre stiva main-ului.

Poti vedea asta simplu din VS ruland in mod debug si apoi vezi in Debug\Windows\Dissasembly.

Dezactivarea optimizarilor iti rezolva problema dar mai e o modalitate:

Code: Select all


#pragma auto_inline(off)
void ceva( int* x,int y)
{
    printf("Am intrat\n");
   
	x[ 3] = 7;  //*

    _asm
    {
        mov eax, [ebp+12]
        mov ebx, [ebp+8]

        mov ecx, [ebx]
    }

    printf("Am iesit\n");
}
#pragma auto_inline()
* in lipsa acestei linii compilatorul va optimiza codul eliminind transmiterea lui x si Y ca nefiind folosite. De asemenea compilatorul din 2005 e suficient de destept sa se prinda ca x[3]=x[3] poate fi sarita. Evident solutia cu deazactivarea optimizarilor se aplica si aici.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: problema release mode

Post by Ovidiu Cucu » 11 Jan 2008, 15:33

msmihai wrote:asta da raspuns :yes:
[ off-topic ]
Daca cumva plasezi quiz-uri urmate de calificative, atunci te rog frumos, ia-o mai usurel!

Eh, am glumit. ;)
Chestia cu "programele gata facute": voiam sa spun ca nu trebuie sa ai incredere 100% intr-un astfel de program, chiar daca provine dintr-o sursa de incredere si ca nu totdeauna este suficient un copy/paste.
Mai ales daca intampini probleme, trebuie sa incerci sa intelegi ce si cum e in ele.

Si BTW. De ce te agati de ASM? C/C++ nu e suficient de "performant"?

msmihai
Junior
Junior
Posts: 6
Joined: 11 Jan 2008, 01:53

Re: problema release mode

Post by msmihai » 11 Jan 2008, 22:59

Si BTW. De ce te agati de ASM? C/C++ nu e suficient de "performant"?
1. Am examen joia viitoare din ASM
2. Daca imi spui cum fac in C++ o functie cu numar variabil de parametri ( la nivelul hardcore, adica sa-i dau direct parametrii de care am nevoie, fara sa-i mai dau parametri de oprire sau numarul lor) , atunci ma las de asm ...

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: problema release mode

Post by neagu_laurentiu » 12 Jan 2008, 11:45

Daca imi spui cum fac in C++ o functie cu numar variabil de parametri... atunci ma las de asm
Asta-i o problema pur scolara/didactica, nu din practica realizarii programelor, deci nu se pune :roll:

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: problema release mode

Post by MrSmersh » 12 Jan 2008, 12:23

argumente elipsa (sau cum le-o spune exact)?
[url]ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vccrt/html/a700dbbd-bfe5-4077-87b6-3a07af74a907.htm[/url]
Si gogu iti zicea din prima de ele.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: problema release mode

Post by Ovidiu Cucu » 12 Jan 2008, 13:22

msmihai wrote: 1. Am examen joia viitoare din ASM
2. Daca imi spui cum fac in C++ o functie cu numar variabil de parametri ( la nivelul hardcore, adica sa-i dau direct parametrii de care am nevoie, fara sa-i mai dau parametri de oprire sau numarul lor) , atunci ma las de asm ...
2. Nu-ti spun, asa ca poti continua linistit cu asm-ul... ;)
1. Bafte la examen!

Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: problema release mode

Post by Viorel » 14 Jan 2008, 12:23

msmihai wrote:asta da raspuns :yes:
intr-adever, fara optimizari merge bine. multumesc mult.
Cred că ar putea să meargă şi cu optimizări, dacă în loc de [ebp+8] foloseşti numele parametrului:

Code: Select all

void ceva(int * tablou, int)
{
    . . .
    mov ebx, tablou
    mov ecx, [ebx]
    . . .
}
Aici compilatorul va înlocui tablou cu o expresie de tipul [ebp + N] sau [esp + N].

Sper să funcţioneze.

Post Reply