.286														;wenigstens 286-Befehle aktivieren
e equ db 66h                    ;Operand Size Prefix (32-Bit Befehle)
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)
e																;mit 32 Bit rechnen
	xor si,si											;Zwischenergebnis (in esi) lschen
  db 66h,0fh,0ach,0d3h,10h			;shrd ebx,edx,16d - dx nach ebx (obere 16 Bit)
	mov bx,ax											;ax nach ebx (unten) - dx:ax jetzt in ebx
e
  xor dx,dx											;edx lschen
e
	mov cx,bx											;Startwert in ecx sichern
e
  mov ax,bx											;auch eax laden

iterat:
e
  idiv bx                       ;durch Xn dividieren
e
	xor dx,dx											;Rest interessiert nicht
e
	add ax,bx											;Xn addieren
e
	shr ax,1											;durch 2 dividieren
e
	sub si,ax                     ;Differenz zum vorherigen Ergebnis
e
	cmp si,1                      ;kleiner gleich 1
  jbe fertig                    ;dann fertig
e
	mov si,ax                     ;Ergebnis als vorheriges sichern
e
  mov bx,ax                     ;als Xn vermerken
e
	mov ax,cx                     ;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