0강 : 개요

1강 : 정수와 부동소수점


이 강의에서 여러분이 처음으로 마주하게될 실습인 데이터랩(datalab)에서는 1강에서 배운 내용을 바탕으로 비트 연산자만 사용해서 다양한 함수를 구현해야 한다. 


실습을 여러분이 직접 해볼 수 있도록 간단한 설명을 하겠다.


0강에서 말한대로 관련 파일을 다운했다면 그 폴더로 들어간다. 


도커를 이용한 경우에는 터미널에 

docker run -p 7777:7777 -v "$PWD/labs:/home/csapp/project" xieguochao/csapp 

를 치고 vscode에 ctrl+shift+p를 쳐서 attach to running container를 클릭한다.


그러면 다음과 같이 여러 파일이 보일 것이다.

제일 중요한건 bits.c 파일이다. 여러분이 풀 문제가 여기 들어있다.


//1
/* 
 * bitXor - ~ 와 & 만을 사용해 x^y를 구현하시오
 *   예시: bitXor(4, 5) = 1
 *   허용된 연산자: ~ &
 *   최대 연산자 수: 14
 *   난이도: 1
 */
int bitXor(int xint y) {
  return 2;
}


이런 식으로 문제와 함께 예시와 쓸 수 있는 연산자, 최대 연산자 수, 난이도가 적혀있다. 총 13문제가 준비되어 있으며 난이도는 4까지 있다.


참고로 조건문이나 반복문 등을 사용할 수 없으며 비트 연산자만 사용해 함수를 완성시켜야 한다. 자세한건 내가 번역해놓은 유인물을 참조하자. 여기에 번역된 실습 설명서(writeup), README, 그리고 bits.c 파일을 올려놓았다. 

https://github.com/Daqsa/csapp-labs-korean-translation/blob/main/datalab/datalab-handout/%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%9E%A9.pdf


문제를 몇개만 더 보여주겠다.

/* 
 * negate - -x를 리턴하시오
 *   예시: negate(1) = -1.
 *   허용된 연산자: ! ~ & ^ | + << >>
 *   최대 연산자 수: 5
 *   난이도: 2
 */
int negate(int x) {
  return 2;
}
/* 
 * conditional - 리턴값은 x ? y : z와 같다. 
 *   예시 : conditional(2,4,5) = 4
 *   허용된 연산자: ! ~ & ^ | + << >>
 *   최대 연산자 수: 16
 *   난이도: 3
 */
int conditional(int xint yint z) {
  return 2;
}
/* 
 * floatFloat2Int - float f에 대해 (int) f를 리턴하시오. 
 *   인자와 리턴값은 unsigned int로 되어있지만 32비트 부동소수점 숫자로 해석되어야 함. 
 *   NaN이나 inf같이 범위를 벗어나는 인자는 0x80000000u를 리턴해야 함. 
 *   허용된 연산자: ||, &&를 포함하는 아무 int/unsigned 연산자. if, while 또한 포함.
 *   최대 연산자 수: 30
 *   난이도: 4
 */
int floatFloat2Int(unsigned uf) {
  return 2;
}


아 또 pdf를 수정하고 싶은 사람들을 위해 .tex 파일도 깃허브에 올려두었다.


DeepL 번역기 덕분에 훨씬 덜 걸린것 같지만 문제를 이해하고 맥락에 맞게 수정해야하고, 또 LaTeX로 pdf 만들다 보니 한 세네시간 걸렸다.


이제 문제를 채점하려면 먼저 make 를 친다. 이러면 btest라는 프로그램이 컴파일된다.


그리고 ./btest 를 치면 각 문제에 대해 채점을 진행한다. 다만 btest는 문제를 맞혔는지 틀렸는지만 확인하지 그 이외의 것(스타일, 가이드라인, 최대 연산자 수를 넘는지 확인) 은 검사를 하지 않는다.


이런것들을 확인하려면 ./dlc bits.c 를 쳐야한다.


./btest -f <문제 이름>을 치면 주어진 문제에 대해서만 채점을 진행한다.


이렇게 테스트가 실패하였고 어디서 실패했는지도 알려준다. 여기서는 함수에 0x80000000을 넣으면 0x0이 나와야 하는데 내 함수에선 0x2가 나왔다고 한다.


코드를 수정한 후에는 make 를 쳐서 컴파일을 다시 해야 한다.


모든 문제를 다 푼 후엔 ./driver.pll 을 쳐서 최종 채점을 진행한다. 이 driver.pl 프로그램은 강사들이 당신의 코드를 채점할때 쓰는 프로그램이다.


이제 필요한건 다 알려줬으니까 직접 실습을 풀어볼 사람들은 풀어봐라. 나도 풀고있는데 logicalNeg하고 howManyBits에서 막혔다. 


물론 인터넷에 치면 답 다 나오는데 최대한 안보고 직접 풀어봐라. 이렇게 잘 만들어진 문제 구하기 쉽지 않다. 


다음 강의에선 어셈블리어를 배워보도록 하자. 


2강 : 어셈블리어 - 기초와 제어문

실습 2 : bomblab

3강 : 어셈블리어 - 프로시저와 데이터

실습 3 : attacklab