AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Division (Bit-Shifting) in ASSEMBLER
Thema durchsuchen
Ansicht
Themen-Optionen

Division (Bit-Shifting) in ASSEMBLER

Ein Thema von Dannyboy · begonnen am 18. Mär 2004 · letzter Beitrag vom 18. Mär 2004
 
tommie-lie
(Gast)

n/a Beiträge
 
#6

Re: Division (Bit-Shifting) in ASSEMBLER

  Alt 18. Mär 2004, 14:25
Ist das dein Code? Dann solltest du eigentlich wissen, was du da verzapft hast

Zuerst: Seit 10 Jahren gibt es das Register EAX, sind schon 32 bit, dann sparst du dir das aufsplitten des Wertes auf AX und BX.

So, dann mal zu deinem bisschen Code:
Variante I ist keine echte 32bit-Division. Du schnappst dir die ersten 16 bits und dividierst sie korrekt durch 4 durch einen schnellen leftshift. So, das bedeutet ja, daß die untersten 4 bits rausgefallen sind und die oberen 4 bits durch Nullbits ersetzt wurden, du hast jetzt in AX also eine 12bit-Zahl. Dann schnappst du dir das höherwertige Word der Variable in BX, beachtest aber nur BL, dadurch ignorierst du die oberen 16 bits, du hast also nur ein Byte.
Wir haben uns gemerkt, in AX sind die oberen 4 bits noch "frei", also suchst du dir aus BL die unteren 4 (0x0F), die oberen 4 werden auf 0 gesetzt (da du ja nach links shiftest, ist das AND eigentlich überflüssig). Jetzt shiftest du sie nach links, in BL stehen jetzt also in den Bits 0-3 (von rechts!!) lauter Nullen und in den Bits 4-7 die untersten 4 bits des High Words der Variable. Um diese 4 Bits in AH zu verfrachten, wo wir ja noch 4 "freie" Bits haben, führst du ein ADD aus (gleichbedeutend mit OR).
Insgesamt hast du also die unteren 16+4=20 Bits der Variable genommen, die unteren 4 weggeschnippelt und aufrücken lassen, eine 20bit-Division durch 16.

In Beispiel II sieht's genauso aus:
Du teilst das Low-Word ganz normal. Da 512 binär 1000000000 (9 Nullen) ist, hast du jetzt in AX die oberen 9 Bits "frei". 16-9=7, also brauchst du noch die unteren 7 Bits des High-Words. Diese besorgst du dir, indem du (dismal das komplette Register, nicht nur das Low-Byte) um 7 nach links verschiebst und anschließend mit AX ein ADD (OR) ausführst.
Du hast hier also auch keine 32bit-Division, sondern eine 16+7=23bit-Division durch 512.


Aber wie gesagt, 32bit-Berechnungen musst du bei den Intel-Architekturen seit 10 Jahren (genauer: seit i486, bzw IA32) nicht mehr aufsplitten. Und DIV und MUL gibt's auch schon seit 'ner ganzen Weile


Edit: 1. Links und Rechts korrigiert (Hey, ich Gymnasiast, ich muss nicht wissen was links und rechts ist). 2. Satz hinzugefügt.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz