Assembler- wie geht das am schlausten?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

ähm...

wenn du 0b1001 (x=9) durch 4 (n=2) teilen willst, dann soll also 3 herauskommen... oder? denn: 9/4=2,25 aufgerundet 3

Methode 2:

0b1001 ist ungerade...und 0b1010/4=2,5 also 2... ==> falsch... oder?

Methode 1:

du brauchst also ein Flag (z. B.: GF0 general purpose flag#0 bei 8051), das dir sagt, ob du eine 1 rausgeshiftet hast:

mov R2, [n]
mov A, R2
jz done
mov A, [x]
clr GF0
loop:
clr C
rrc ; rotate right through carry
orl C, GF0
mov GF0, C
djnz R2, loop
jnb GF0, noceil
inc A
noceil:
mov [x], A
done:
Woher ich das weiß:Studium / Ausbildung

Setze x=33, setze n=7.

Bei Methode 2 dürfte das schiefgehen.

Auf- und abrunden kannst du mit integer math, auch in assembly, indem du x vor dem teilen durch 2 inkrementierst.

Das ergibt dann für verschiedene x:

x x+1 (x+1)/2
0  1    0
1  2    1
2  3    1
3  4    2

...


Bushmills145  24.08.2022, 00:22

Geht auch mit anderen Divisoren: Dividend erst linksschieben, dann Integerdivision durch beliebigen Divisor, Integerquotient inkrementieren und dann rechtsschieben. Läßt sich so auch in eine generische Integerdivsionsfunktion mit Ergebnisrundung einbringen.

0