ASR — Arithmetic Shift Right

Syntax:ASR Rd
Funktion:Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach rechts geschoben. Das Bit 7 verändert sich dabei nicht, das Bit 0 wird in das Carry-Flag geschoben. Damit stellt dieser Befehl eine vorzeichenbehaftete Division durch 2 dar. Das Carry-Flag kann dazu benutzt werden, das Ergebnis zu runden.
Operation:C ← Rd0 ← Rd1 ← Rd2 ← Rd3 ← Rd4 ← Rd5 ← Rd6 ← Rd7
Operanden:0 ≤ d ≤ 31
Programmzähler:PC ← PC + 1
Words:1 (2 Byte)
Zyklen:1
16-Bit-Opcode:1001 010d dddd 0101

Flags im Status-Register SREG

ITHSVNZC
---
S:Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V:Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement-Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N:Das N-Flag wird gesetzt, wenn das Bit 7 des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z:Das Z-Flag wird gesetzt, wenn das Ergebnis 0x00 ist, andernfalls wird das Flag gelöscht.
C:Das C-Flag wird gesetzt, wenn das Bit 0 im Register Rd vor dem Schieben gesetzt war. War das Bit 0 vorher gelöscht, so wird auch das Carry-Flag gelöscht.

Beispiel

	ldi	r16,16		;Die Dezimalzahl 16 in R16 laden
	asr	r16		;R16 := R16/2 = 8
;oder
	ldi	r16,-4		;Die Dezimalzahl -4 in R16 laden
	asr	r16		;R16 := R16/2 = -2