Assembly buborék rendezés
2020-05-08T23:13:30+02:00
2020-05-15T12:59:08+02:00
2022-08-11T19:55:30+02:00
FLaminyoo
Sziasztok! Olyan problémám lenne hogy házinak csinálnunk kell egy bubblesortt programot amit C-ben írunk viszont a függvényt intel assemblyben kell megvalósítanunk.Jelenleg a program teljes mértékben lefut viszont semmi változás nem történik a tömbben.Fogalmam sincs mi lehet a hiba és nem tudok rájönni,ha esetleg valamiben tudnátok segíteni azt nagyon megköszönném! Az assembly kódolásom kérlek ne kritizáljátok még tanulom erősen a nyelvet,tehát nem minden úgy megy még ahogy kellene és ahogy szeretném.
Válaszaitokat előre is köszönöm!
A kód jelenleg:
.
intel_syntax noprefix .text .global arraysort arraysort: # int sortarray(int array[],int length) #fuggveny prologus push ebp mov ebp, esp # fuggveny prologus vege push ebx # ebx erteket elmentjuk cdecl konvencio miatt # 1.argumentum [ebp + 4*2] ez lesz a tomb # 2.argumentum [ebp + 4*3] ez a hosszusaga a tombnek mov ecx, [ebp + 12] #tomb hosszusaga (6) dec ecx #tomb hosszusaga (5) mov esi, [ebp + 8] #ez lesz itt a tömb kulsociklus: # for (i = length-1;i > 0;i--) cmp ecx,0 jl vege mov edi, 0 #array index reset =0 mov edx, 1 #array index+1 reset=1 belsociklus: mov eax, [esi + 4*edi] mov ebx, [esi + 4*edx] cmp eax, ebx jg csere cmp edx, 6 jz belsociklusveg inc edi inc edx jmp belsociklus csere: xchg eax, ebx inc edi inc edx jmp belsociklus belsociklusveg: dec ecx jmp kulsociklus vege: pop ebx mov esp, ebp pop ebp ret
Mutasd a teljes hozzászólást!

  • Nem látom azt a részt, ahol a felcserélt értékek (eax, ebx) visszamennek a memóriába.
    Mutasd a teljes hozzászólást!
  • Közben igen én is fel figyeltem erre és ezt a kódot részletet

    csere: xchg eax, ebx inc edi inc edx jmp belsociklus
    cseréltem erre :

    xchg [esi + 4*edx], eax xchg [esi + 4*edi], ebx inc edi inc edx jmp belsociklus
    Viszont még így is hibás.Több mint valószínű a ciklusokkal lesz gondom.
    Mutasd a teljes hozzászólást!
  • Vagy esetleg másra gondoltál ?
    Mutasd a teljes hozzászólást!
  • Elég lenne a xchng után:

    xchng eax, ebx mov [esi + 4*edi], eax mov [esi + 4*edx], ebx
    Vagy, ha maga az eax, ebx értéke nem kell már ezután, akkor csere helyett csak:
    mov [esi+4*edi], ebx mov [esi+4*edx], eax

    Ha módosítottad a kódot, akkor idézd be a teljes új állapotot, a hibaüzenettel vagy hibajelenség leírásával együtt.
    Mutasd a teljes hozzászólást!
  • Jelenleg már müködik a kód viszont ha valami mások lesznek a tömb értékei akkor még nem teljesen jó. A ciklusokra tudok gondolni hogy azok a hibásak.
    Jelenlegi input : int array[]= {7,5,3,4,6,8};
    Az output:  3,4,5,6,7,8


    A kód:

    .intel_syntax noprefix .text .global arraysort arraysort: # int sortarray(int array[],int length) #fuggveny prologus push ebp mov ebp, esp # fuggveny prologus vege push ebx # ebx erteket elmentjuk cdecl konvencio miatt # 1.argumentum [ebp + 4*2] ez lesz a tomb # 2.argumentum [ebp + 4*3] ez a hosszusaga a tombnek mov ecx, [ebp + 12] #tomb hosszusaga (6) dec ecx #tomb hosszusaga (5) mov esi, [ebp + 8] #ez lesz itt a tömb kulsociklus: # for (i = length-1;i > 0;i--) cmp ecx,0 jl vege mov edi, 0 #array index reset =0 mov edx, 1 #array index+1 reset=1 belsociklus: mov eax, [esi + 4*edi] #betöltjük az eax-be az array
    elemet mov ebx, [esi + 4*edx] #betöltjük az eax-be az array[i+1] elemet cmp eax, ebx # ha eax > ebx jg csere #akkor ugrunk a csere cimkere cmp edx, [ebp + 12] # !ha edx < length jl belsociklusveg #akkor ugrunk a belso ciklus vegere inc edi # i++ inc edx #i+1 ++ jmp belsociklus #visszaugrunk a ciklus elejere csere: mov [esi + 4*edx], eax #visza rakjuk az eredeti tömbbe az ellentétes értéket mov [esi + 4*edi], ebx #vissza rakjuk az eredeti tombe az ellentétes értéket inc edi # i++ inc edx #i+1 ++ jmp belsociklus #visszaugrunk a belso ciklus elejere belsociklusveg: dec ecx # csokkentjuk a kulso ciklus szamlalojat jmp kulsociklus #visszaugrunk a kulso ciklus elejere #fuggveny epilogus vege: pop ebx mov esp, ebp pop ebp ret #fuggveny epilogus vege
    Az előző hozzá szólásod alapján átírva tényleg sikerült vissza írni a tömb-be. Ezzel kapcsolatban köszönöm a segítséged.

    Mutasd a teljes hozzászólást!
  • És mit várnál, mi legyen a kimenet?
    Mutasd a teljes hozzászólást!
  • Bocsi elfelejtettem leírni egy másik inputot.
    Input 7,5,3,4,9,8
    Output: 3,4,5,7,9,8
    Gondolom jelenleg az a probléma hogy eggyel kevesebbszer fut le a ciklus,viszont ha azt állítom be feltételnek hogy edx = count akkor szegmentálási hibát fogok kapni valószínűleg nem jó a feltétel és túlindexelődik. Hogy akkor hogyan kellene ezt meg írnom.
    Mutasd a teljes hozzászólást!
  • Egy másik input :
    Az alap tömb így nézett ki: 7,5,9,4,6,8
    A rendezett tömb pedig így: 5,7,9,4,6,8
    Itt ismét gondolom a feltételben lesz a baki nem ? :/
    Mutasd a teljes hozzászólást!
  • kulsociklus:  # for (i = length-1;i > 0;i--)
    cmp ecx,0
    jl vege

    Mintha ez nem ugyanaz lenne.
    Mutasd a teljes hozzászólást!
  • Lehet butaság de mi lenne ha megírnád c ben és disassemblereznéd aztán összehasonlítanád hogy hol tér el a 2?
    Mutasd a teljes hozzászólást!
  • Pontosabban: szerintem ez a két utasítás az i>=0 feltételnek felel meg, jng (vagy jle) lenne az i>0
    Mutasd a teljes hozzászólást!
  • -Hibás feltételes elágazás, mert így nem megy végig a belső cikluson!

    jl belsociklusveg &nbsp;#akkor ugrunk a belso ciklus vegere
    -Ha cserélni kell az elemeket, akkor nincs belső ciklus kilépés ellenőrzés!
    -Amikor van akkor pedig egy constanshoz hasonlítod!

    cmp edx, 6
    A hibakereséshez érdemes debuggert használni.

    Nem megoldás, csak gondolatébresztés:

    procedure TForm1.Buborek(var Szamok: array of Integer; const Darab: Integer); label ciklusk, ciklusb, kovetkezo; begin Assert(Darab > 1, 'Nincs meg a szükséges elemszám!'); asm mov edi, Szamok mov ebx, Darab dec ebx ciklusk: mov ecx, ebx mov esi, edi ciklusb: mov eax, [esi] cmp eax, [esi + 4] jl kovetkezo xchg eax, [esi + 4] mov [esi], eax kovetkezo: add esi, 4 loop ciklusb dec ebx jnz ciklusk end; end;
    Mutasd a teljes hozzászólást!
abcd