.286
w equ word ptr

code segment public
assume cs:code
public wurzel
public wurzfkt
                                ;Radikand Wert in dx:ax
wurzel proc pascal              ;Ergebnis in ax (Function)
.386
  xor esi,esi                   ;Zwischenergebnis (in esi) lschen
  shrd ebx,edx,16d              ;dx nach ebx (obere 16 Bit)
  mov bx,ax                     ;ax nach ebx (unten) - dx:ax jetzt in ebx
  xor edx,edx                   ;edx lschen
  mov ecx,ebx                   ;Startwert in ecx sichern
  mov eax,ebx                   ;auch eax laden

iterat:
  idiv ebx                      ;durch Xn dividieren
  xor edx,edx                   ;Rest interessiert nicht
  add eax,ebx                   ;Xn addieren
  shr eax,1                     ;durch 2 dividieren
  sub esi,eax                   ;Differenz zum vorherigen Ergebnis
  cmp esi,1                     ;kleiner gleich 1
  jbe fertig                    ;dann fertig
  mov esi,eax                   ;Ergebnis als vorheriges sichern
  mov ebx,eax                   ;als Xn vermerken
  mov eax,ecx                   ;Startwert fr Division erneut laden
  jmp iterat                    ;und zum Schleifenstart
fertig:
  ret                           ;Ergebnis steht jetzt in eax
wurzel endp

wurzfkt proc pascal a:dword     ;bersetzt Prozedur in Pascal-Funktion
  mov ax,word ptr a             ;Parameter in Register schreiben
  mov dx,word ptr a+2
  call wurzel                   ;und Wurzel ziehen
  ret
wurzfkt endp

code ends
end
