반응형
문제
어셈블리 코드를 C 코드로 복원한 결과, 빈칸 채우기
# 어셈블리
코드
cmpl $0, %edi
jle .L1
movl $1, %edx
jmp .L2
.L1:
movl $0, %edx
.L2:
movl %edx, %eax
ret
# C 코드
int function(int x) {
int y;
if ( ____(1) )
_____(2);
else
y = 0;
return ____(3);
}
문제풀이
- %edi : 첫 번째 인자 x (%rdi의 하위 32비트, int 라서 e)
- %edx : 지역 변수 y 보관용
- %eax : 반환값 (%rax의 하위 32비트)

cmpl $0, %edi
- cmpl : 비교만 하고 결과는 플래그에 남긴다
- cmp 는 두 값을 빼보기만 하고 결과는 버리는 명령어이다. 여기서는 x- 0 을 계산한다.
- 결과의 정보 (0인지, 음수인지 등) 을 조건 코드 (플래그/ 1비트) 라는 표시에 기록해둔다.
- l : long, 4 바이트 int 크기라는 뜻이다.
- 피연산자 순서
- AT&T 에서는 cmpl A, B 가 B - A 를 계산하고 B를 A와 비교로 읽는다.
그래서 이 줄은 x(%edi) 를 0($0) 과 비교(cmpl) 하는 것 이다.
jle .L1
- jle : jump if less or equal : 직전 비교 결과가 x <= 0 이면 .L1 으로 점프한다.
- 조건이 거짓이면 (x > 0) 점프하지 않고 바로 다음 줄로 내려간다.

jmp .L2
- jmp : 무조건 점프
- 조건 없이 항상 .L2 로 간다. if 본문을 실행한 뒤 else 부분을 건너뛰기 위해 쓴다.
.L1:
movl $0, %edx
.L2:
movl %edx, %eax
- 실행되는 명령어가 아닌, 점프 목적지를 표시하는 이름표이다. 컴파일러가 자동으로 .L1, .L2를 붙인다.
if - else 의 번역 패턴
조건이 거짓이면 → else로 점프
if 본문
jmp → 끝으로 (else 건너뛰기)
else:
else 본문
끝:
이어지는 코드
어셈블리의 점프 조건이 C 의 if 조건과 반대라는 것이 중요하다. 어셈블리는 else 로 빠질 조건을 검사한다.
cmpl $0, %edi # x와 0 비교
jle .L1 # x <= 0이면 else로 → 즉 if 조건은 x > 0
movl $1, %edx # if 본문: y = 1
jmp .L2 # else 건너뛰기
.L1:
movl $0, %edx # else 본문: y = 0
.L2:
movl %edx, %eax # 반환값 = y
ret # return
int function(int x) {
int y;
if (x > 0) // (1)
y = 1; // (2)
else
y = 0;
return y; // (3)
}
어려웠던 점
- 대략적인 개념은 알고 있었는데 (어셈블리의 점프 조건이 반대인 것, movl, .L1 등...) 실제로 적용해보는건 다른거구나 느꼈다. 책의 예제 문제들을 꼼꼼히 안 보고, 적용을 안해서 문제를 제대로 못 푼 것 같다. 원래 AI 요약만 봤었는데, 앞으로는 한번이라도 책을 읽어볼 것이다.
반응형