wie div verwenden



  • hallo

    wie verwendet man div ?

    hab folgendes probiert:

    __asm
          {
             mov eax, b;
             mov ecx, 10;
             div ecx
             mov b, eax;
             mov c, edx;
          }
    

    b = 12345;
    muesste normalerweise nicht in b 1234 und in c 5 stehen ?
    in c steht 2 und in b 4259304303.

    hab zwar hier das asm buch von podschun, aber das ist von mir aus gesehen eigendlich nur ne asm-referenz. zu mindest hab ich noch keine beispiele oder aehnliches drinnen gesehen, wo man sieht wie was funktioniert.
    gibts da ein "deutschsprachiges tutorial" im netz, wo wenigstens wo einfache sachen wie mul, div, schleifen erklaert werden ?

    cermy

    Meep Meep



  • b = 12345;
    muesste normalerweise nicht in b 1234 und in c 5 stehen ?

    nur wenn man EDX vorher auf 0 setzt.
    Ansosnten wird angenommen dass in EDX der höherwertige Doubleword steht (und man damit eine 64-bit Zahl dividiert)
    Müsste eigentlich in deiner Referenz stehtn.
    Hier gibts die offizielle:
    http://download.intel.com/design/Pentium4/manuals/25366615.pdf

    so sollte es gehen:

    __asm
          {
             mov eax, b;
             mov ecx, 10;
             xor edx,edx
             div ecx
             mov b, eax;
             mov c, edx;
          }
    


  • es kommt ja auch darauf an was in edx steht(ps.dein code hat bei mir sogar einen integer overflow verursacht-wundert mich das dass bei dir so reibungslos laeuft). auf alle faelle sollte edx in diesem falle auf 0 gesetzt werden.
    also dann sieht das ganze so aus:

    __asm {
    	mov eax,b 
    	mov ecx,10
    	xor edx,edx
    	div ecx
    	mov b,eax
    	mov c,edx
    	};
    

    zum thema assemblerbuch: http://computer-literatur.de/buecher/Programmiersprachen_nachTitel.html#Assembler

    Das Assembler-Buch: echt ein super buch wie ich finde



  • re

    danke fuer eure antwort. jetzt funktionierts. ist garnicht so leicht am anfang.
    kommt mir das nur so vor oder ist das etwas umstaendlich, das man vor jeder division edx auf 0 setzen muss ? der asm arbeitet bei der division dann, bei verwendung von eax, mit 64 bit zahlen ? nur 32 funktioniert nicht ? oder muss ich dann die unteren 16 bit nach ax und die restlichen nach dx kopieren ? auch recht umstaendlich, falls das so sein sollte.

    Meep Meep



  • div nimmt als Dividend immer einen Wert, der doppelt so lang ist wie die uebrigen Werte. zB. bei 8Bit-Division ist der Dividend ax (16Bit), bei 16Bit ist's ax:dx (32Bit) und bei 32Bit eben eax:edx (64Bit).
    Ob das nun sinnvoll ist? Ich meine: Irgendwo schon, wenn man bedenkt, dass es sich bei mul mit dem Produkt genauso verhaelt.

    BTW:
    Egal wie lang der Dividend ist, der Quotient und Rest muessen jeweils in die 8/16/32Bit-Register passen, sonst gibt's 'ne exception.



  • re

    mal gucken ob ich das nun richtig verstanden habe.
    edx::eax werden z.b. durch ecx dividiert. wenn das ergibnis nicht in eax reinpasst, weil es zu gross ist, dann gibt´s ne exception.
    wie macht man das dann wenn man ne richtige 64 bit zahl dividieren will ?
    z.b. 2^45 durch 3 ?
    in dem fall wuerde der hoehere 32 bit teil der ergebnis in edx stehen, wuerde aber auch zugleich vom rest ueberschrieben werden. is das so korrekt ?

    Meep Meep



  • Meep Meep schrieb:

    wie macht man das dann wenn man ne richtige 64 bit zahl dividieren will ?

    Du kannst die Zahl in eax:edx packen und dann durch eine 32Bit lange Zahl dividieren. Musst wie gesagt nur aufpassen, dass der Divisor gross genug ist, so dass der Quotient in eax passt.
    Ansonsten musst du auf groessere Register (64Bit-Architektur von AMD zB. oder die FPU-Register mit entsprechenden CPU-Erweiterungen) oder eigene Algos zum Dividieren zurueckgreifen.

    Meep Meep schrieb:

    z.b. 2^45 durch 3 ?
    in dem fall wuerde der hoehere 32 bit teil der ergebnis in edx stehen, wuerde aber auch zugleich vom rest ueberschrieben werden. is das so korrekt ?

    Bei Div gibt es keinen hoeheren Teil des Ergebnisses in anderen Registern.
    Der Quotient kommt immer nach al/ax/eax und der Rest immer nach ah/dx/edx. Das einzige was zwangslaeufig ueberschrieben wird, ist der Dividend, der vorher in eax:edx stand.
    Wenn also wie gesagt bei der Division eines 64Bit-Wertes durch eine 32Bit-Zahl der Quotient nicht in eax passt, gibt es eine exception.


Anmelden zum Antworten