자꾸 세그폴트나는데 어딘지 모르겠대
.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
댓글 0