자꾸 세그폴트나는데 어딘지 모르겠대


.data
buffer:    .space    8
BUFSIZE:    .int    8
file_in:   .string "pa2-1.in"
msg_GCD:   .string "Greate Common Divisor\t[%d, %d] = %d\n"
msg_LCM:   .string "Least Common Multiple\t[%d, %d] = %d\n"

/* code section start */
.text
.globl   main
main:
/* === file open === */
movq $2, %rax      /* open(   ; syscall #: 2 */
movq $file_in, %rdi   /* "hw2-3.in"   ; filename */
movq $0x000, %rsi   /* O_RDONLY   ; flags */
movq $0644, %rdx   /* 0644      ; mode */
syscall         /* );      ; */

movq %rax, %rbx      /* save fd */
/* === file read === */
movq $0, %rax      /* read (   ; syscall #: 0 */
movq %rbx, %rdi      /* fd       ; file deor */
movq $buffer, %rsi   /* buf       ; buffer address */
movq $BUFSIZE, %rdx   /* BUFSIZE   ; read size (byte unit) */
syscall         /* ); */

/* === file close === */
movq $3, %rax
movq %rbx, %rdi
syscall

/* === call gcd() === */
push %rax
movq $buffer, %r12
movl (%r12), %edi
movl 4(%r12), %esi
call _gcd
movl %eax, %ebx
pop %rax

/* === call lcm() === */
push %rax
movq $buffer, %r12
movl (%r12), %edi
movl 4(%r12), %esi
call _lcm
movl %eax, %ecx
pop %rax

/* === print result === */
push %rax
push %rcx
movq $msg_GCD, %rdi
movq $buffer, %r12
movl (%r12), %esi
movl 4(%r12), %edx
movl %ebx, %ecx
call printf
pop %rcx
pop %rax

movq $msg_LCM, %rdi
movq $buffer, %r12
movl (%r12), %esi
movl 4(%r12), %edx
call printf

/* === exit === */
movq $60, %rax
movq $0, %rdi
syscall

_gcd:
/* ============= Start of your code ================== */

   movl   %edi, (%r8)
   movl   %esi, 4(%r8)
   movl   (%r8), %eax
   cmpl    %eax, 4(%r8)
   jg      .L1 /* n<m 이면 L1 점프 */
   /* n >= m 이면 j=m */
   movl   4(%r8), %eax
   movl   %eax, (%r10)
   jmp   .L2
.L1:
/* j = n */
   movl   (%r8), %eax
   movl   %eax, (%r10)  
.L2:
/* i=j */
   movl   (%r10), %eax
   movl   %eax, (%r13)
   jmp   .L3
.L3:
/* i>0 조건 확인 */
   cmpl   $0, (%r13)
   /* i > 0 일때 L4 점프*/
   jg   .L4
   /* 조건 해당 안되면 L6 점프 */
   jmp   .L6

.L4:
/*if (n%i == 0 && m%i == 0) 조건문 수행 */
   movl   (%r8), %eax
/* idivl 수행하기 위하여 Convert to quad word 수행 */
   cltd
/* n%i 수행 */
   idivl   (%r13)
/* 나머지값은 %edx 에 저장됨. n%i == 0 인지 확인 */
   testl   %edx, %edx
/* 0이 아니라면 i-- 조건으로 이행 */
   jne   .L5
/* 0이라면 && 의 다음 조건 수행 */
   movl   4(%r8), %eax
/* idivl 수행하기 위하여 Convert to quad word 수행 */
   cltd
/* m%i 수행 */
   idivl   (%r13)
/* 나머지값은 %edx 에 저장됨. m%i == 0 인지 확인 */
   testl   %edx, %edx
/* 같으면 break 수행 */
   je   .L6
.L5:
/* i-- 수행 */
   subl   $1, (%r13)
.L6:
/* return i */
   movl   (%r13), %eax

/* ============== End of your code =================== */
ret

_lcm:
/* ============= Start of your code ================== */

   movl   %edi, (%r8)
   movl   %esi, 4(%r8)
   movl   (%r8), %eax
   cmpl    %eax, 4(%r8)
   jl      .L11 /* m<n 이면 L11 점프 */
   /* m >= n 이면 j=m */
   movl   4(%r8), %eax
   movl   %eax, (%r10)
   jmp   .L12
.L11:
/* j = n */
   movl   (%r8), %eax
   movl   %eax, (%r10) 
.L12:
/* i=j */
   movl   (%r10), %eax
   movl   %eax, (%r13)
   jmp   .L13
.L13:
/* i <= m*n 조건 확인 */
   movl   4(%r8), %eax
   imull   (%r8), %eax
/* 하위 32비트만 확인해도 되므로 %edx는 생략한다 */
   cmpl   %eax, (%r13)
/* i <= m*n 에 해당하면 .L14로 점핑 */
   jle   .L14
/* 해당안하면 return 으로 */
   jmp   .L16

.L14:
/*if (i%n == 0 && i%m == 0) 조건문 수행 */
   movl   (%r13), %eax
/* idivl 수행하기 위하여 Convert to quad word 수행 */
   cltd
/* i%n 수행 */
   idivl   (%r8)
/* 나머지값은 %edx 에 저장됨. i%n == 0 인지 확인 */
   testl   %edx, %edx
/* 0이 아니라면 i+=j 조건으로 이행 */
   jne   .L15
/* 0이라면 && 의 다음 조건 수행 */
   movl   (%r13), %eax
/* idivl 수행하기 위하여 Convert to quad word 수행 */
   cltd
/* i%m 수행 */
   idivl   4(%r8)
/* 나머지값은 %edx 에 저장됨. m%i == 0 인지 확인 */
   testl   %edx, %edx
/* 같으면 break 수행 */
   je   .L16
.L15:
/ i+=j 조건으로 이행 */
   movl   (%r10), %eax
   addl    %eax, (%r13)  
.L16:
/* return i */
   movl   (%r13), %eax

/* ============== End of your code =================== */
ret