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: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| procedure TNDamen.Setzen; ASM PushAD // alle Register auf den Stapel Mov EBP, Offset Steigend // Startadresse von Steigend Mov ESI, Offset Fallend // Startadresse von Fallend Mov ECX, Offset Spalte // Startadresse von Spalte Mov EDI, Offset Horizontal // Startadresse von Horizontal Dec EBP // Startadresse-1 Dec ESI // Startadresse-1 Dec ECX // Startadresse-1 Dec EDI // Startadresse-1 Mov AL,M // AL:=M Y konstant Mov AH,N // AH:=N X konstant Mov BL,AH // BL:=N X variabel Mov BH,AL // BH:=M Y variabel Xor EDX,EDX // EDX:=0 @Start: Dec BH // Y:=Y-1 Jz @Unten // Y=0 ==> springe zu Label Unten Mov DL,BH // DL:=BH, Indexregister Cmp [EDI+EDX],DH // HO[Y]>0? Jg @Start // falls ja, zu Label Start Add DL,BL // X+Y Cmp[ESI+EDX],DH // FA[X+Y]>0? Jg @start // falls ja, zu Label Start Mov DL,AL // DL:=M Add DL,BH // DL:=M+Y Sub DL,BL // DL:=M+Y-X Cmp [EBP+EDX],DH // ST[M+Y-X]>0? Jg @Start // falls ja, zu Label Start Mov [EBP+EDX],BH // ST[M+Y-X]:=Y Mov DL,BL // DL:=X Mov [ECX+EDX],BH // SP[X]:=Y Mov DL,BH // DL:=Y Mov [EDI+EDX],BH // HO[Y]:=Y Add DL,BL // DL:=DL+X Mov [ESI+EDX],BH // FA[X+Y]:=Y Mov BH,AL // Y:=M Dec BL // X:=X-1 Jg @Start // falls X>0, zu Label Start Inc DWord Ptr[Anzahl] // Anzahl:=Anzahl+1 @Unten: Inc BL // X:=X+1 Cmp BL,AH // X>N Jg @Ende // falls ja, zu Label Ende Mov DL,BL // DL:=X Mov BH,[ECX+EDX] // Y:=SP[X] Mov DL,BH // DL:=Y Mov [EDI+EDX],DH // HO[Y]:=0 Add DL,BL // DL:=DL+X Mov [ESI+EDX],DH // FA[X+Y]:=0 Mov DL,AL // DL:=M Add DL,BH // DL:=M+Y Sub DL,BL // DL:=M+Y-X Mov [EBP+EDX],DH // ST[M+Y-X]:=0 Jmp @Start // springe zu Label Start @Ende: PopAD // alle Register vom Stapel end; |