티스토리 뷰
얼마 전에 페이스북에 올라온 질문인데, “MIPS 어셈블리 코드 중 beq
를 안쓰고 bne
를 쓰는 이유는 무엇인가요?” 라는 질문이다.
아래와 같은 C 언어 코드가 있고,
if (i == j) f = g + h; else f = g - h;
이를 순서도로 나타내면 다음과 같다.
컴파일러와 최적화 옵션에 따라 생성되는 어셈블리 인스트럭션이 아래와 똑같다고 말할 수 없다.
일반적으로 컴파일러는 인스트럭션을 생성할 때 조건문의 경우 반대 조건으로 해석해서 인스트럭션을 작성한다. 이런 경우 대부분 인스트럭션의 크기가 짧아지기 때문에 더 적은 클럭에서 명령을 수행할 수 있기 때문이다. 따라서 아래와 같은 어셈블리 코드가 생성된다.
# bne 를 사용하는 코드
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else:
sub $s0, $s1, $s2
Exit:
다음은 beq
를 사용하는 코드이다.
# beq 를 사용하는 코드
beq $s3, $s4, Then
sub $s0, $s1, $s2
j Exit
Then:
add $s0, $s1, $s2
Exit:
어?? 이상하다. 책의 내용을 보면 분명 ‘더 효율적이다.’ 라고 언급하는데, 무엇이 더 효율적인지 우열을 가리기 힘들다. 맞다. 단항 비교 연산인 경우 비교적으로 bne
와 beq
의 코드 길이에 대한 효율성 차이는 그리 크지 않다.
그렇다면, bne
가 더 효율적이려면 다음의 코드로 생각을 해보자.
if (i==j && i==k) f = g + h; else f = g - h;
바로 각각 beq
코드와 bne
코드로 구현해 보자.
# beq 를 사용하는 코드
beq $s3, $s4, And
j Else
And:
beq $s3, $s5, Then:
j Else
Then:
add $s0, $s1, $s2
j Exit
Else:
sub $s0, $s1, $s2
Exit:
다음 코드는 bne
를 사용하는 코드이다.
bne $s3, $s4, Else
bne $s3, $s5, Else
add $s0, $s1, $s2
j Exit
Else:
sub $s0, $s1, $s2
Exit:
위 두 코드의 결과를 보면 확실하게 bne
코드의 결과가 적은 인스트럭션을 생성하는 것을 볼 수 있다. AT&T, x86, ARM 코어 등을 막론하고 대부분 조건 비교는 (!contidion) 형태를 띄고 있다.
참고로 더 자세한 내용을 알고 싶다면 필자가 추천하는 뇌를 자극하는 프로그래밍 원리 : CPU부터 OS까지 책을 참고하길 바란다. 참 좋은 책이다 ^^
'C++' 카테고리의 다른 글
[Swift] Xcode 6.3, Swift 1.2 업그레이드 시 언어 사양이 변경된 부분 정리 (0) | 2015.04.23 |
---|---|
[Redis] 새로 추가한 mysql 명령어로 db 연동 (0) | 2014.04.21 |
[OpenSSL] 디버깅을 통해 알아보는 Heartbleed 취약성 버그 (0) | 2014.04.17 |
[GDB] Hopper Disassembler 앱 (0) | 2014.02.12 |
[퀴즈] 프로그래머를 위한 문제 #4 - 또라이 같은 C 언어 코드를 설명하라 (0) | 2013.12.30 |
- Total
- Today
- Yesterday
- ***** MY SOCIAL *****
- [SOCIAL] 페이스북
- [SOCIAL] 팀 블로그 트위터
- .
- ***** MY OPEN SOURCE *****
- [GITHUB] POWERUMC
- .
- ***** MY PUBLISH *****
- [MSDN] e-Book 백서
- .
- ***** MY TOOLS *****
- [VSX] VSGesture for VS2005,200…
- [VSX] VSGesture for VS2010,201…
- [VSX] Comment Helper for VS200…
- [VSX] VSExplorer for VS2005,20…
- [VSX] VSCmd for VS2005,2008
- .
- ***** MY FAVORITES *****
- MSDN 포럼
- MSDN 라이브러리
- Mono Project
- STEN
- 일본 ATMARKIT
- C++ 빌더 포럼
- .
- testing
- Visual Studio
- TFS 2010
- 비주얼 스튜디오
- test
- monodevelop
- c#
- Team Foundation Server 2010
- MEF
- Visual Studio 11
- POWERUMC
- Visual Studio 2010
- 팀 파운데이션 서버
- Silverlight
- umc
- Managed Extensibility Framework
- .NET Framework 4.0
- ASP.NET
- mono
- Team Foundation Server
- .NET
- 엄준일
- Windows 8
- TFS
- 땡초
- ALM
- LINQ
- 비주얼 스튜디오 2010
- Visual Studio 2008
- github
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |