Assembly mértani sor - osztás

Címkék
Assembly mértani sor - osztás
2018-05-06T23:24:35+02:00
2018-05-08T12:17:49+02:00
2022-08-11T03:00:30+02:00
progpreg
Sziasztok! Egy mértani sorozatot kell csinálnom órára Assemblyből és az lenne a problémám, hogy nem tudok 2 osztást elvégezni egyszerre, hogy megmaradjon mindkettőnek az értéke. Esetleg tudna ebben segíteni valaki?
Eddig idáig jutottam a programmal:
Mutasd a teljes hozzászólást!
Csatolt állomány
Az eredeti kódoddal két gond is van:
 - a MUL mindig az akkumulátorral szoroz (AL, AX, EAX, stb.), szóval a "MUL EBX" nem azt csinálta, amire gondoltál
 - fordítva írattad ki, hogy valami mértani sorozat vagy sem.

Működő változat:

... MOV EAX, A MOV ECX, D MUL ECX CALL WriteDec CALL Crlf MOV ECX, EAX MOV EAX, B MUL EAX CALL WriteDec CALL Crlf CMP ECX, EAX JNE ifelse MOV EDX,OFFSET MertaniTxt CALL WriteString JMP vege ifelse: ...
Kicsit lusta, mert az eredmények alsó 32 bitjét hasonlítja csak össze (ECX-be mentve).
Csinizhető úgy, hogy a "MOV ECX,EAX" mellé teszel egy "MOV EBX,EDX"-et is, és összehasonlítod ezt a párost is:

CMP ECX, EAX JNE ifelse CMP EBX, EDX JNE ifelse
NevemTeve ötlete is működik, de azért kell egy kicsit kalapálni rajta, hogy a MASM megegye:

MOV EAX, A MOV ECX, D MUL ECX CALL WriteDec CALL Crlf MOV DWORD PTR prod1,EAX MOV DWORD PTR prod1+4,EDX MOV EAX, B MUL EAX CALL WriteDec CALL Crlf MOV DWORD PTR prod2,EAX MOV DWORD PTR prod2+4,EDX LEA ESI,prod1 LEA EDI,prod2 MOV AX, DS MOV ES, AX CMPSD JNE ifelse
Mutasd a teljes hozzászólást!

  • Igazából azt kellene ellenőrizned, hogy a három számra (jelölje őket a, b és c) teljesül-e, hogy ac=bb, pl 4,6,9 (q=3/2), vagy 1,0,0 (q=0)
    Mutasd a teljes hozzászólást!
  • Ha meg nem ellenőrizni, hanem előállítani akarsz, akkor c=bb/a, persze külön kezelve az a=0 esetet. Meg azt, hogy az eredmény nem feltétlenül egész szám.
    Mutasd a teljes hozzászólást!
  • Igen, az nekem eddig meg is van, csak az első osztás eredményét melyik változóba menti le és hogy tudom úgy megcsinálni, hogy a második osztásba ne kelljen már használt változót használnom?
    vagyis, hogy van ez a része a programnak:
    MOV EDX, B + 4
    MOV EAX, B
    DIV A
    CALL WriteDec
    és a másik osztást milyen regiszterrel csináljam akkor? És az mibe menti le az értékét?

    Sajnálom, hogy ennyit értetlenkedek, de még eléggé kezdő vagyok benne
    Mutasd a teljes hozzászólást!
  • Kezdetnek:
    1. Nincs szükséged két osztásra.
    2. A 'MOV DX,B+4' nem jó, hiszen a B csak négybájtos. Legyen ott 'LEA DX,0' vagy ilyesmi.
    3. A (rész)eredmények tárolására használhatsz regisztereket vagy stacket (lásd PUSH/POP). Vagy 'memóriát.
    Mutasd a teljes hozzászólást!
  • Vagy akár azt is elárulhatod, hogy pontosan mi a feladat, amit meg akarsz oldani.
    Mutasd a teljes hozzászólást!
  • Annyi a feladat, hogy meg kell adni 3 számról, hogy az mértani sorozat vagy nem és annyit kell kiírni, hogy ez mértani e
    Mutasd a teljes hozzászólást!
  • Hát, erre már meg is van a válasz.
    Vagyis csak szorozni és összehasonlítani kell: a*c egyenlő-e b*b-vel
    Mutasd a teljes hozzászólást!
  • Még egy problémám van, utána tényleg békén hagylak.

    Ebben mi a hiba? vagyis megtudtam szorzással csinálni, nekem ez a módszer eszembe se jutott, hogy szorzással is lehetne, de most akármit beírok, azt írja ki, hogy mértani
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Azt nem tudom, hogy a WriteDec mit csinál, mi a paramétere, és milyen regisztereket ront el, de a MUL eredménye az EDX:EAX regiszterpárba kerül, onnan kellene elmenteni, pl:

    prod1 DQ 0 prod2 DQ 0 ... MOV EAX, A MUL D MOV prod1,EAX MOV prod1+4,EDX CALL WriteDec MOV EAX, B MUL B MOV prod2,EAX MOV prod2+4,EDX CALL WriteDec LEA SI,prod1 LEA DI,prod2 MOV ES,DS ; ha esetleg nem eleve így van CMPSD
    Mutasd a teljes hozzászólást!
  • A CALL WriteDec csak meghívja kiírásra a függvényt, de így most hibát ír ki és nem enged futtatni
    Mutasd a teljes hozzászólást!
  • > A 'CALL WriteDec' csak meghívja kiírásra a függvényt,

    Ez egészen hihetően hangzik, ha begépelem a google fordítónak a 'call' és 'write' szavakat. Sajnos ebből még nem derül ki, hogy a WriteDec mit/hogyan ír ki, mi a paramétere, és milyen regisztereket ront el.

    > de így most hibát ír ki és nem enged futtatni

    Elveszett a mondatból az alany, kérlek keresd meg;)
    Ha az Assembler hibát ad, idézd be a problémás sorral együtt.
    Mutasd a teljes hozzászólást!
  • Az eredeti kódoddal két gond is van:
     - a MUL mindig az akkumulátorral szoroz (AL, AX, EAX, stb.), szóval a "MUL EBX" nem azt csinálta, amire gondoltál
     - fordítva írattad ki, hogy valami mértani sorozat vagy sem.

    Működő változat:

    ... MOV EAX, A MOV ECX, D MUL ECX CALL WriteDec CALL Crlf MOV ECX, EAX MOV EAX, B MUL EAX CALL WriteDec CALL Crlf CMP ECX, EAX JNE ifelse MOV EDX,OFFSET MertaniTxt CALL WriteString JMP vege ifelse: ...
    Kicsit lusta, mert az eredmények alsó 32 bitjét hasonlítja csak össze (ECX-be mentve).
    Csinizhető úgy, hogy a "MOV ECX,EAX" mellé teszel egy "MOV EBX,EDX"-et is, és összehasonlítod ezt a párost is:

    CMP ECX, EAX JNE ifelse CMP EBX, EDX JNE ifelse
    NevemTeve ötlete is működik, de azért kell egy kicsit kalapálni rajta, hogy a MASM megegye:

    MOV EAX, A MOV ECX, D MUL ECX CALL WriteDec CALL Crlf MOV DWORD PTR prod1,EAX MOV DWORD PTR prod1+4,EDX MOV EAX, B MUL EAX CALL WriteDec CALL Crlf MOV DWORD PTR prod2,EAX MOV DWORD PTR prod2+4,EDX LEA ESI,prod1 LEA EDI,prod2 MOV AX, DS MOV ES, AX CMPSD JNE ifelse
    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?
Címkék
abcd