[시스템 프로그래밍] 어셈블리어 - 반복문
조건문은 어셈블리어의 jX 명령어와 대응되지만, 반복문은 어셈블리어에서 대응되는 명령어가 없다.
즉 jX 명령어와 몇 가지 다른 명령어들의 조합으로 반복문을 구현해야 하는데, 이제 그 예시를 살펴보자.
do-while
do-while은 실행식이 무조건 한 번은 꼭 실행된다는 부분을 제외하면 while문과 같은 역할을 한다.
위의 그림은 do-while 문법을 goto 문법으로 표현한 후 어셈블리어로 변환하는 예시이다.
while
while문은 조건식에 따라 실행식이 한 번도 실행되지 않을 수도 있다.
while문을 어셈블리어로 변환하는 예시를 살펴보자.
1. Jump to Middle
goto 문법을 사용해 바로 조건식으로 이동시키고, 실행식 내부에서 goto 문법을 통해 조건식에 따라 실행식으로 이동시키는 방법을 사용한다.
2. do-while로 변환
첫 부분에서 조건식의 결과에 따라 실행식의 실행 여부를 결정한다.
사실 첫 번째 방법과 크게 다른 점은 없다.
for
for문은 while문으로 변환해서 어셈블리어로 번역된다.
while문으로 변환한 후에는 Jump to Middle을 사용하거나 do-while로 변환한 후 어셈블리어로 번역하면 된다.
Switch
사실 switch문은 반복문보다는 조건문에 가깝지만..
어차피 반복문이든 조건문이든 비슷한 명령어의 조합으로 구현되는건 같기 때문에 이쪽에 작성한다.
당연히 switch문법은 if-else 문법으로 정확히 변환될 수 있고, 컴파일러가 어셈블리어로 번역 시에도 if-else문법으로 변환한 후 어셈블리어로 번역하는 전략을 선택하기도 한다. (case 값의 밀집도와 case의 수를 고려해서 결정한다)
하지만, switch문법을 제대로 작성하면 단순 if-else문법으로 번역한 결과보다 훨씬 더 효과적인 프로그램을 만들 수 있다.
switch문을 어셈블리어로 번역할 때 컴파일러는 점프 테이블이라는 자료구조를 만들고, 조건식에 따라 바로 해당하는 실행문을 실행할 수 있도록 도와준다.
조금만 생각 해 봐도 if-else보다 효율적이라는걸 알 수 있다.
if-else문법을 실행하면 첫 번째 if부터 조건식이 참이 될 때 까지 계속 비교하는 작업을 수행하는데, 점프 테이블을 사용하면 바로 목적지를 찾아갈 수 있다. (O(N) -> O(1))
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] 프로세스 (1) (0) | 2022.11.06 |
---|---|
[시스템 프로그래밍] 프로시저 (0) | 2022.10.28 |
[시스템 프로그래밍] 어셈블리어 - 조건문 (0) | 2022.10.23 |
[시스템 프로그래밍] 어셈블리어 (0) | 2022.10.13 |
[시스템 프로그래밍] 정수의 산술연산과 실수의 표현 (0) | 2022.09.29 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] 프로세스 (1)
[시스템 프로그래밍] 프로세스 (1)
2022.11.06 -
[시스템 프로그래밍] 프로시저
[시스템 프로그래밍] 프로시저
2022.10.28 -
[시스템 프로그래밍] 어셈블리어 - 조건문
[시스템 프로그래밍] 어셈블리어 - 조건문
2022.10.23 -
[시스템 프로그래밍] 어셈블리어
[시스템 프로그래밍] 어셈블리어
2022.10.13