CS/컴퓨터 구조

[컴퓨터 구조 번외](2)[어셈블리 문제 풀어보기 2]

황올뱀 2025. 1. 30. 19:01

문제

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

728x90
반응형