// argumenty przekazywane przez stos,
// za uporządkowanie stosu odpowiada wywołujący funkcję
// wszystkie rejestry zachowywane przez wołanego
.intel_syntax noprefix
.globl main
.text
main:
mov eax, 10
push eax
call silnia
add esp, 4
push eax
push offset msg
add esp, 8
mov eax, 0
ret
silnia:
push ebp
mov ebp, esp
push ecx
push edx
mov eax, [ebp+8]
cmp eax, 0
jne dalej
mov eax, 1
pop edx
pop ecx
pop ebp
ret
dalej:
push eax
dec eax
push eax
call silnia
add esp, 4
pop ecx
mul ecx
pop edx
pop ecx
pop ebp
ret
.data
msg: .asciz "silnia=%d\n"
Ly8gYXJndW1lbnR5IHByemVrYXp5d2FuZSBwcnpleiBzdG9zLCAKLy8gemEgdXBvcnrDhOKApmRrb3dhbmllIHN0b3N1IG9kcG93aWFkYSB3eXdvxLnigJp1asOE4oCmY3kgZnVua2Nqw4TihKIKLy8gd3N6eXN0a2llIHJlamVzdHJ5IHphY2hvd3l3YW5lIHByemV6IHdvxLnigJphbmVnbwoJLmludGVsX3N5bnRheCBub3ByZWZpeAoJLmdsb2JsIG1haW4KCS50ZXh0CgptYWluOgoJbW92IGVheCwgMTAKCglwdXNoIGVheAoJY2FsbCBzaWxuaWEKCWFkZCBlc3AsIDQKCglwdXNoIGVheAoJcHVzaCBvZmZzZXQgbXNnCgljYWxsIHByaW50ZgoJYWRkIGVzcCwgOAoKCW1vdiBlYXgsIDAKCXJldAoKc2lsbmlhOgoJcHVzaCBlYnAKCW1vdiBlYnAsIGVzcAoJcHVzaCBlY3gKCXB1c2ggZWR4CQoJbW92IGVheCwgW2VicCs4XQoJY21wIGVheCwgMAoJam5lIGRhbGVqCgltb3YgZWF4LCAxCglwb3AgZWR4Cglwb3AgZWN4Cglwb3AgZWJwCglyZXQKZGFsZWo6CglwdXNoIGVheAoJZGVjIGVheAoJcHVzaCBlYXgKCWNhbGwgc2lsbmlhCglhZGQgZXNwLCA0Cglwb3AgZWN4CgltdWwgZWN4Cglwb3AgZWR4Cglwb3AgZWN4Cglwb3AgZWJwCglyZXQKCgkuZGF0YQptc2c6CS5hc2NpeiAic2lsbmlhPSVkXG4iCg==