어셈블리를 이용한 최소 공배수
글쓴이: esaram5 / 작성시간: 토, 2021/05/15 - 3:08오전
어셈블리를 이용해서 최소 공배수를 구할려고 하고 있습니다.
테스트케이스에서 3 6 9를 집어넣은결과 18이 최대 공배수로 나오는데
제 생각엔 cmpl에서 문제가 발생한것 같습니다. cmp와 jmp에 대해서 어떻게 해야 할까요?
원본이 되는 c코드
int lcm (int n, int m, int l) { int i, j; if (n > m) j = n; else j = m; if (j > l) j = l; for (i=j; i <= m*n*l; i+=j) if (i%n==0 && i%m==0 && i%l == 0) break; return i; }
작성한 어셈블리
movl %edi, %r15d # n=j cmpl %edi, %esi # if n > m cmovg %esi, %r15d # j = m cmpl %r15d, %edx # if j > l cmovg %edx, %r15d # j = l movslq %r15d, %r14 #i=j for문 초기조건 sub %r15d, %r14 # i=i-j .L3: add %r15d, %r14d # i = i+j movl $1, %r13d imull %edi, %r13d imull %esi, %r13d imull %edx, %r13d # r13d = n*m*l cmpl %r14d, %r13d jle .L4 # l나누기 movl %edx, %r12d #l값 백업 movl $0, %edx movl %r14d, %eax #피제수 세팅 idivl %r12d # 나누기 cmpl $0, %edx #나머지 비교 jne .L3 # i%l != 0이면 반복 # m나누기 movl $0, %edx movl %r14d, %eax #피제수 세팅 idivl %esi # 나누기 cmpl $0, %edx #나머지 비교 jne .L3 # i%l != 0이면 반복 # n나누기 movl $0, %edx movl %r14d, %eax #피제수 세팅 idivl %edi # 나누기 cmpl $0, %edx #나머지 비교 jne .L3 # i%l != 0이면 반복 .L4 movl %r14d, %eax ret
for문을 구성하는 코드
movslq %r15d, %r14 #i=j for문 초기조건 sub %r15d, %r14 # i=i-j .L3: add %r15d, %r14d # i = i+j movl $1, %r13d imull %edi, %r13d imull %esi, %r13d imull %edx, %r13d # r13d = n*m*l cmpl %r14d, %r13d jle .L4
Forums:
최대 공배수? 본문에는 최대 공약수라고 되어있네요.
최대 공배수?
본문에는 최대 공약수라고 되어있네요.
세벌 https://sebuls.blogspot.kr/
수정했습니다
. 최대공약수 구하는 파트도 있어서 오타난것 같습니다.
댓글 달기