1. %include "asm_io.inc"
  2.  
  3. segment .data
  4.  
  5.     prompt1 db "Bitte n (>=0) für die Ackermann-Berechnung eingeben: ",10,0
  6.     prompt2 db "Bitte m (>=0) für die Ackermann-Berechnung eingeben: ",10,0
  7.     prompt3 db "Das Ergebniss ist: ",0
  8.     promptError db "n und m müssen beide >= 0 sein",10,0
  9.     n dd 0
  10.     m dd 0
  11.    
  12. segment .bss
  13.  
  14. segment .data
  15.     global asm_main
  16. asm_main:
  17.     ENTER 0,0               ;setup Routine
  18.     PUSHA
  19.     MOV eax, prompt1        ;ask for n
  20.     CALL print_string
  21.     CALL read_int
  22.     CMP eax, 0              ;check n
  23.     JL inputError
  24.     MOV ebx, eax
  25.     MOV eax, prompt2        ;ask for m
  26.     CALL print_string
  27.     CALL read_int
  28.     CMP eax, 0              ;check m
  29.     JL inputError
  30.     PUSH ebp
  31.     PUSH ebx                ;push n
  32.     PUSH eax                ;push m
  33.  
  34. ackermann:
  35.     MOV [n], [ebp+4]
  36.     MOV [m], [ebp+8]
  37.     CMP [n], 0
  38.     JE b1
  39.     CALL ackermann
  40.     POP [m]
  41.     POP [n]
  42.     POP ebp
  43. end:
  44.     POPA
  45.     MOV eax, 0              ;return Value for C-driver
  46.     LEAVE
  47.     RET
  48.    
  49. inputError:                 ;n or m was <0
  50.     MOV eax, promptError
  51.     CALL print_string
  52.     JMP end
  53.    
  54. b1: