본문 바로가기

Programming Language/Assembly

[Assembly] 재귀함수 구현

실행환경

- cpu : 인텔계열(64bit)

- 컴파일러 : nasm

- 리눅스 : ubuntu 16.04 LTS


설치방법

sudo apt-get install nasm


컴파일

- nasm -f elf64 파일명.asm -o 파일명.o  --> 목적파일을 만든다.

- ld 파일명.o -o 파일명  --> 실행파일을 만든다.


문제 : 3! 구해보기 , 4!이상은 결과값이 10이상이므로 따로 처리를 해줘야 된다.

reclusive.asm

section .bss

onum resb 2

result resb 5

section .data

inum db "Input num : "

len equ $ -inum

end db 0x0a

section .text

global _start


%macro write 2

mov eax,4

mov ebx,1

mov ecx,%1

mov edx,%2

int 0x80

%endmacro

%macro read 2

mov eax,3

mov ebx,1

mov ecx,%1

mov edx,%2

int 0x80

%endmacro


_start:

write inum,len

read onum,2


mov bx,[onum]

sub bx,'0'

call factorial


add ax,'0'

mov [result],ax

write result,1

write end,1


mov eax,1

int 0x80


factorial:

;넘어온 값을 가지고 비교를 한다.

;만약 1보다 크다라면 곱해준다.

cmp bl,1 ;1보다 크다면 (bx가 bl을 포함한다.)

jg cal

mov al,1

jmp exit


cal:

dec bl

call factorial

inc bl

mul bl ; ax = al*bl

exit:

ret