1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
PROCEDURE Setze(Ziel: Integer);
ASM
MOV RDX, Z // RDX := adresse de Z (directe)
MOVSXD RAX, EAX // Étendre Ziel de 32 à 64 bits
ADD RDX, RAX // RDX := @(Z^[Ziel])
MOV RCX, RAX // RCX := Ziel (64 bits)
SHL RCX, 3 // RCX := Ziel * 8
ADD RCX, Q // RCX := @(Q^[Ziel])
MOVZX RAX, byte ptr [RDX] // RAX := Z^[Ziel] (extension zéro)
ADD RCX, RAX // Inc(RCX, Z^[Ziel])
MOV AL, byte ptr [Quell] // AL := Quell
CMP byte ptr [Setzen], 0 // Comparer Setzen avec 0
JZ @negativ
// Branche positive
MOV byte ptr [RCX], AL // Q^[Ziel, Z^[Ziel]] := Quell
INC byte ptr [RDX] // Inc(Z^[Ziel])
INC dword ptr [Beweg] // Inc(Beweg)
RET
@negativ:
DEC byte ptr [RDX] // Dec(Z^[Ziel])
DEC dword ptr [Beweg] // Dec(Beweg)
MOV AH, byte ptr [RCX-1] // AH := Q^[Ziel, Z^[Ziel]]
@Finde:
DEC RCX // Décrémenter pointeur 64 bits
CMP byte ptr [RCX], AL // Comparer avec AL
JNE @Finde // Continuer si différent
MOV byte ptr [RCX], AH // Remplacer par AH
END; |
Partager