이진검색의 if문에 대한 어셈블리언어 최적화에 대해.
글쓴이: superdma / 작성시간: 수, 2009/09/30 - 1:33오후
첨부되어 있는 binserach 소스코드에서
다음과 같은 설명이 있습니다.
while 루프를 한 번 수행할 때마다 x와 S[mid]의 비교가 두 번 이루어진다(x를 찾는 경우는 제외).
이 알고리즘을 효율적으로 어셈블리언어로 구현하면, 각 루프마다 x를 S[mid]와 한 번만 비교하고, 그 비교의 결과로 비교 코드를 설정하여, 그 조건 코드의 값을 기준으로 하여 적절히 분기가 일어나도록 할 수 있다.
다시 말하면, while 루프 한 번 수행에 x와 S[mid]는 한 번만 비교한다는 것이다.
if( x == S[mid])
{
...
}
else if( x < S[mid] )
{
...
}
else
{
...
}
위에 같은 구조에서 각각 if 와 else if 문에서 cmp 가 이루어 집니다.
위에 제시되어 있는 본문처럼 효율적인 어셈블리언어로 구현한다는 의미가 직접 어셈코드로 짠다는 것 같은데,
어떻게 하면 while문에서 cmp를 한번하고 위와 같은 결과값을 가질 수 있을까요?
File attachments:
첨부 | 파일 크기 |
---|---|
ex1.5.jpg | 1.33 MB |
Forums:
실제 assm 코드를 잘 모르나 아마
C 코드로 이야기 하면 아래와 같겠죠.
즉 공통 expression을 뽑아 하나로 처리.
assembly 레벨이면 해당 C코드를 cmp, jump(x86이라면 je, jl등) 명령을 사용하여 적절히 branch 분기하도록 코드가 짜여지겠죠.
compiler에 따라 자동으로 최적화된 assm code 생성 가능
오래 되어서 생각이
오래 되어서 생각이 잘 안나는데,
cmp 를 사용하면 큰 경우, 작은 경우, 같은 경우에 따라 flag 가 바뀌는 걸로 기억이 되네요.
그닥
제가 알기론
요즘 컴파일러는 님처럼 코딩하시면
알아서 cmp 하나로 처리해 줍니다.
댓글 달기