Skip to content
Snippets Groups Projects
Commit dd1c0907 authored by Nayoung Kim's avatar Nayoung Kim
Browse files

update lec09

parent 34a44afb
No related branches found
No related tags found
No related merge requests found
...@@ -1328,3 +1328,190 @@ int main() ...@@ -1328,3 +1328,190 @@ int main()
paster(9); // output : token9 = 9 paster(9); // output : token9 = 9
} }
``` ```
### Macro Definition (2)
* Multiple lines
* 여러 줄 define 하고 싶을 때
```
#define NUMBERS 1, \
2, \
3
int x[] = { NUMBERS };
//int x[] = {1,2,3};
```
* Define Where?
```
foo = X;
#define X 4
bar = X; // foo = X and bar = 4
#define TABLESIZE BUFSIZE
#define BUFSIZE 1024
// TABLESIZE == BUFSIZE ==1024
#define BUFSIZE 1020
#define TABLESIZE BUFSIZE
#undef BUFSIZE
#define BUFSIZE 37 // TABLESIZE = 37
```
### Macro Definition (3) - Function like Macro
* if문 보다 성능이 좋음
```
#define min (X, Y) ((X) < (Y) ? (X) : (Y))
x = min(a,b); -> ((a) < (b) ? (a) : (b));
y = min(1,2); -> ((1) < (2) ? (1) : (2));
z = min(a + 28, *p) -> z = ((a+28) < (*p) ? (a+28) : (*p));
```
### Macro Definition (4) - Stringization and concat
* Stringization
* Parameter leading with #
```
#define str(s) #s
#define foo 4
str(foo) // "foo"
```
* Concatenation
```
#define COMMAND(name) { #name, name##_command }
COMMAND(quit) // { "quit", quit_command }
```
### Macro Definition (5) - Variadic
* #define eprintf(...) fprintf (stedrr, __VA_ARGS__)
```
eprintf ("%s:%d: ", input_file, lineno)
-> fprintf (stderr, "%s:%d: ", input_file, lineno)
#define eprintf(format, ...) fprintf (stderr, format __VA_OPT__(,) __VA_ARGS__)
```
## **Lecture 09**
### Linux Command
1. cc -g
* gdb에게 제공하는 정보를 바이너리에 삽입
* -g 옵션을 사용하지 않고 gdb로 디버깅하면 역어셈블리 코드에서 어셈블리 코드로만 디버깅 가능
2. cc -pg
* 프로파일을 위한 코드 삽입
* -pg 옵션으로 컴파일 → gmon.out(프로파일 정보) → gprof로 gmon.out 파일 분석
### gdb Command
* 실행파일과 소스파일이 같은 디렉토리에 있어야 제대로 동작
1. gdb (실행파일)
* 시작 명령
2. run
* 프로그램 실행
3. break (line or *address)
* 정지 명령
* break n : n번째 라인에서 정지 (정지점 생성)
* break Add : Add가 포함된 라인에서 정지 (정지점 생성)
4. clear
* 정지점 삭제
* clear n : n번째 라인 정지점 삭제
5. delete breakpoints
* 정지점 모두 지움
6. step
* 현재 라인 수행 후 정지
* 함수 호출 시 함수 안으로 들어감
* step n : step 명령 n번 수행
7. next
* 현재 라인 수행 후 정지
* 함수 호출 시 함수 다음 라인으로 넘어감
* next n : next 명령 n번 실행
8. print
* 주소나 변수 등을 출력
9. list
* 소스 파일 내용 출력
* list a, b : a ~ b번째 라인의 소스 출력
10. continue
* 다음 정지점까지 코드 실행
11. watch
* 해당 변수에 watchpoint를 설정하여 변수가 바뀔 때마다 현재 값을 출력함
12. info reg
* 특정 레지스터의 정보 출력
13. set
* 특정 메모리 혹은 레지스터에 값을 지정
14. finish
* 현재 함수를 수행하고 빠져나감
15. Quit (q)
* 종료 명령
### CPU
* ALU (Arithmetic / Logic Unit)
* CU (Control Unit)
### 고정소수점 관련 코드
* 부동소수점 대신 고정소수점을 사용하는 이유
* 부동소수점은 컴퓨터에 따라 연산에 많은 에너지를 필요로 함
* S32_31 => signed long long
* S16_15 => signed int
* S8_7 => signed short
* S4_3 => signed character
```
#include <stdio.h>
// #### #### #### #### . #### #### #### ####
// S 15 . 16
#define FX_Q_NUM 16
#define FX_2_MINUS_16 1.52587890625e-05F
#define FX_2_PLUS_16 (1<<16)
#define FX_S_15_16 11516
#define FX_SYSTEM FX_S_15_16
typedef int fixed32;
fixed32 fromFloat(float fa)
{
return (fixed32) (fa * FX_2_PLUS_16);
}
float toFloat(fixed32 xa)
{
return ((float) (xa)) * FX_2_MINUS_16;
}
fixed32 fxAdd(fixed32 a, fixed32 b)
{
return fromFloat(toFloat(a)+toFloat(b));
}
fixed32 fxAdd2(fixed32 a, fixed32 b)
{
return a+b;
}
int main()
{
int i = 0;
int ia, ib, ic, ic2;
float fa;
fscanf(stdin, "%d %d", &ia, &ib);
for (i = 0; i < 64*256*256*256; i+=(256*256)){
ic = fxAdd(i, i);
ic2 = fxAdd2(i, i);
fprintf(stdout, "%f + %f : %f, %f diff = %d \n", toFloat(i), toFloat(i), toFloat(ic), toFloat(ic2), ic-ic2);
}
fprintf(stdout, "%d + %d : %d \n", ia, ib, ic);
}
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment