78 lines
1.1 KiB
Text
78 lines
1.1 KiB
Text
%include "io.inc"
|
|
|
|
section .text
|
|
global CMAIN
|
|
CMAIN:
|
|
mov ebx, 7 ;size
|
|
call mloop
|
|
ret
|
|
|
|
mloop:
|
|
mov edx, 0 ;edx stands for the nth line
|
|
looping:
|
|
push ebx
|
|
push edx
|
|
call line
|
|
pop edx
|
|
pop ebx
|
|
inc edx
|
|
cmp edx, ebx
|
|
jl looping
|
|
xor eax, eax
|
|
ret
|
|
|
|
line:
|
|
mov ecx, 0 ;ecx stands for the nth character in each line
|
|
mlp:
|
|
push ecx
|
|
push edx
|
|
call nCk
|
|
pop edx
|
|
pop ecx
|
|
PRINT_DEC 4, eax ;print returned number
|
|
PRINT_STRING " "
|
|
inc ecx
|
|
cmp ecx, edx ;if
|
|
jle mlp
|
|
NEWLINE
|
|
ret
|
|
|
|
nCk:
|
|
;ecx : j
|
|
;edx : i
|
|
mov esi, edx
|
|
call fac ;i!
|
|
push eax ;save i!
|
|
mov esi, ecx
|
|
call fac ;j!
|
|
push eax ;save j!
|
|
mov ebx, edx
|
|
sub ebx, ecx ;(i-j)
|
|
mov esi, ebx
|
|
call fac ;(i-j)!
|
|
pop ebx ;(i-j)! is in eax
|
|
mul ebx ;(i-j)! * j!
|
|
mov ecx, eax
|
|
pop eax ; get i!
|
|
div ecx ; ; last step : i! divided by (i-j)! * j!
|
|
ret
|
|
|
|
fac:
|
|
push ecx
|
|
push edx
|
|
mov eax, 1
|
|
mov ecx, esi
|
|
cmp ecx, 0 ; 0! returns 1
|
|
je facz
|
|
lp:
|
|
mul ecx ;multiplies eax by ecx and then decrements ecx until ecx is 0
|
|
dec ecx
|
|
cmp ecx, 0
|
|
jg lp
|
|
jmp end
|
|
facz:
|
|
mov eax, 1
|
|
end:
|
|
pop edx
|
|
pop ecx
|
|
ret
|