;exportar label de inicio do programa global _start section .data ;seccao data - dados inicializados ; variaveis de 32 bits x: dd 0 n: dd 4 section .text ;seccao text - codigo _start: nop ; x = n! - (n-1)! push dword [n] call calcula add esp, 4 mov [x], eax ; chamada ao sistema para terminar o programa mov eax, 1 ;codigo de "exit" mov ebx, 0 ;valor retornado ao sistema int 0x80 ;chamda ao sitema calcula: push ebp mov ebp, esp push ebx sub esp, 4 ;ebp - 4 = n! push dword [ebp + 8] call factorial add esp, 4 mov [ebp - 4], eax ;save n; mov eax, [n] dec eax push eax call factorial add esp, 4 mov ebx, eax ;ebx = (n - 1)! mov eax, [ebp - 4] ;eax = n! sub eax, ebx add esp, 4 pop ebx pop ebp ret factorial: push ebp mov ebp, esp push ebx mov ebx, [ebp + 8] mov eax, ebx loop: dec ebx cmp ebx, 1 jle endfact imul ebx jmp loop endfact: pop ebx pop ebp ret