문제
void switcher(long a, long b, long c, long *dest){
long val;
switch(a){
case -(1)-:
c = -(2)-:
case -(3)-:
val = -(4)-;
break;
case -(5)-:
case -(6)-:
val = -(7)-;
break;
case -(8)-;
val = -(9)-;
break;
default:
val = -(10)-;
}
*dest = val;
}
라는 c 코드가 있다. 위를 어셈블리어로 바꾼다면
// a in %rdi, b in %rsi, c in %rdx, pointer** dest in %rcx
swticher:
cmpq $7, %rdi
ja .L2
jmp *.L4(, %rdi, 8)
.section .rodata
.L7:
xorq $15, %rsi
movq %rsi, %rdx
.L3:
leaq 112(%rdx), %rdi
jmp .L6
.L5:
leaq (%rdx, %rsi), %rdi
salq $2, %rdi
jmp .L6
.L2:
movq %rsi, %rdi
.L6:
movq %rdi, (%rcx)
ret
// jump table
.L4:
.quad .L3
.quad .L2
.quad .L5
.quad .L2
.quad .L6
.quad .L7
.quad .L2
.quad .L5
이다. 이때, 각 빈칸에 맞는 답을 채우시오
해답
rdi에 있는 값이 7보다 크다면 L2로 가고,
그렇지 않다면 점프테이블에 있는 레이블로 이동한다.
각각
0일때 L3
1, 3, 6일때 L2
2, 7일때 L5
4일때 L6
5일때 L7
이제 각 경우마다 분석하면 된다.
L6
%rcx가 가리키는 곳에 %rdi값 넣고 반환 (*dest = a)
L2
%rdi = %rsi (a = b)
이후 L6으로 계속
따라서 *dest = (a = b) = b
L3
%rdi = %rdx + 112 (a = c + 112)
이후 L6으로 점프
따라서 *dest = c + 112
L5
lea연산으로 %rdi = %rdx * %rsi (a = b + c)
%rdi = %rdi<<2
이후 L6로 점프
따라서 *dest = (b + c)<<2
L7
%rsi = %rsi ^ 15 (b = b^15)
%rdx = %rsi (c = b^15)
이후 L3로 계속
%rdi = %rdx + 112 (a = b^15 + 112)
이후 L6으로 점프
따라서 *dest = b ^ 15 + 112
이에 맞춰 빈칸을 채워본다면
default인 L2로 7보다 크거나 1, 3, 6일때이다. 따라서 (10) = b
나머지도 마찬가지로 채워준다면
(1) = 5
(2) = b ^ 15
(3) = 0
(4) = c + 112
(5), (6) = 2, 7 (5번과 6번은 순서 바뀌어도 상관 없음)
(7) = (b + c)<<2
(8) = 4
(9) = a
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조](18)[공간 지역성과 캐시] (0) | 2025.02.12 |
---|---|
[컴퓨터 구조](17)[버퍼 오버플로우] (0) | 2025.01.31 |
[컴퓨터 구조 번외](1)[어셈블리 문제 풀어보기 1] (0) | 2025.01.29 |
[컴퓨터 구조](16)[어셈블리어 7] (0) | 2025.01.28 |
[컴퓨터 구조](15)[어셈블리어 6] (0) | 2025.01.27 |