MSVC inline assembler ciklusfeltöltés

MSVC inline assembler ciklusfeltöltés
2012-12-17T08:42:11+01:00
2012-12-18T18:19:05+01:00
2022-11-27T17:45:40+01:00
Perseus
Üdv,

Biztos valami semmiség de nem látom.
__asm { PUSH ESI PUSH ECX ; ------------------------------ XOR ESI , ESI XOR ECX , ECX ; ------------------------------ LEA ESI, values MOV ECX , length_var ; ------------------------------ MyLoop: ; stop condition CMP ECX, 0 JZ MyLoopEnd ; write to memory location MOV DWORD PTR [ESI], 0 ; modify counters INC ESI DEC ECX ; start again JMP MyLoop MyLoopEnd: ; ------------------------------ POP ECX POP ESI };
Stack around variable .... was corrupted hibaüzenet folyamatosan. Google nem igazán dobott érdekességet, maximum mégjobban nem értem hol a hiba.
Mutasd a teljes hozzászólást!
nem ugyanaz a két parancs:
int* values = (int*)malloc(length_var * 0x04);
ezután például a következő értékeket veszi fel:
values 0x00c65820 int *
&values 0x0046fad4 int * *
*values 0xcdcdcdcd int

MOV ESI, values :
ESI == 0x00c65820

LEA ESI, values :
ESI == 0x0046fad4

vagyis a LEA a pointer címét tölti be az ESI-be, de neked a pointer által mutatott hely kell (pointer értéke)

ui.: LEA-val az adott scope stack-jét írod közvetlenül felül,
itt 2 változó van, viszont a kód 15db int méretű változót ír (ezzel túl is írja), mondjuk ebben a részben nem vagyok 100%-ig biztos
Mutasd a teljes hozzászólást!

  • Ez a hiba akkor szokott jönni, mikor egy tömböt túlindexelsz, pl.:

    int a[100]; a[99] = 0; //ok a[100] = 0; //nem ok!

    A Te kódodban gondolom, values[length_var] = 0 lehet a gond.
    Bár nem vagyok otthon sajnos asm-ben, szóval, majd megmondják az okosabbak.
    Mutasd a teljes hozzászólást!
  • Más gubanc lesz ott. Ha LEA helyett sima MOV-al használom a dolgokat és INC ESI helyett is ADD ESI 4 van, tehát:
    __asm { PUSH EAX PUSH ECX PUSH ESI MOV EAX , 0x01 MOV ECX , length_var MOV ESI , values ; ------------------------------ MyLoop: MOV DWORD PTR [ESI] , EAX INC EAX ADD ESI , 0x04 DEC ECX CMP ECX, 0x00 JNZ MyLoop ; ------------------------------ POP ESI POP ECX POP EAX };
    akkor tökéletesen működik. Ha visszaírom LEA-ra, és INV ESI akkor ismét elszáll corrupted stack assertion-el.
    Mutasd a teljes hozzászólást!
  • A values változó pointer a c/c++ kódban?
    Mutasd a teljes hozzászólást!
  • Ja persze ezt lehagytam.
    int main(int argc, char* argv[]) { unsigned int length = 0x0F; int* values = (int*)malloc(length * 0x04); if (values == 0x00) { perror("..."); return 1; } __asm { ; a már közölt kód. }; int idx; for (idx = 0; idx < length; ++idx) { printf("%d\n", values[idx]); } return (0); }
    Mutasd a teljes hozzászólást!
  • nem ugyanaz a két parancs:
    int* values = (int*)malloc(length_var * 0x04);
    ezután például a következő értékeket veszi fel:
    values 0x00c65820 int *
    &values 0x0046fad4 int * *
    *values 0xcdcdcdcd int

    MOV ESI, values :
    ESI == 0x00c65820

    LEA ESI, values :
    ESI == 0x0046fad4

    vagyis a LEA a pointer címét tölti be az ESI-be, de neked a pointer által mutatott hely kell (pointer értéke)

    ui.: LEA-val az adott scope stack-jét írod közvetlenül felül,
    itt 2 változó van, viszont a kód 15db int méretű változót ír (ezzel túl is írja), mondjuk ebben a részben nem vagyok 100%-ig biztos
    Mutasd a teljes hozzászólást!

  • MOV DWORD PTR [ESI], 0 ; modify counters INC ESI


    Az inc csak 1 -el növeli a címet.
    Neked 4-el kell!

    Mutasd a teljes hozzászólást!
  • De eleve a ciklusod nem jo.
    Vagyis lehet jo, csak felesleges.


    cim=kezdo_ertek veg_ertek leptek ciklus: if (cim==veg_ertek) break; mov [cim],x add cim,leptek jmp ciklus
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd