[0. Overview]
# compile [.cpp, .h]-> preprocessing [.i, .ii]-> compilation [.s]-> assemble [.o, .obj]-> linking[.exe]
# objdump: object file의 binary data를 확인 가능하게 해주는 리눅스 명령어/ reverse engineer
# 'int's are not integers, 'float's are not reals - finite space 때문(수는 무한하지만, 컴퓨터 자료형의 표현 공간은 유한)
Is x^2 >= 0? int는 4byte에 표현되지 않으면 overflow가 발생
Is (x+y)+z = x+(y+z) ?
[1. Bits and Bytes]
# Boolean Algebra
Algebraic representaion of logic; TRUE = 1, FALSE = 0
Exclusive-Or (Xor): A와 B가 다른 boolen이면 A^B = 1
> Operations
# Bit-Level Operations in C: &, |, ~, ^
- 비트 단위 연산
# Logic Operations in C: &&, ||, !
- TRUE = 0이 아닌 모든 값, FALSE = 0
- 리턴값은 항상 0 혹은 1
- if (p && *P); avoid null pointer access
# Shift Operations
- Left Shift: x << y
- arithmetic이랑 logical 모두 0으로 채운다.
- Right Shift: x >> y
- arithmetic은 앞 부호에 맞는 비트로 채우고, logical은 0으로 채운다.
> Machine Words
[64 bits(8 bytes): pointer가 가르키는 주소의 크기]을 사용하는 machine이 증가
> Accessing Words in Memory
pointer를 사용하면 address를 하나 가지고 온다. 이 때 주소의 multi byte에서 첫번째 byte를 가르키게 된다.
> Byte Ordering; bytes가 continuos하게 저장되는 방법
# Big Endian; Least significant byte has highest address
# Little Endian; Least significant byte has lowest address - 이걸 더 많이 쓴다.
[2. Data Representation - int]
> Unsigned and Signed
#어려워! 시험에 나올 수도 있을 거 같아!!
#이건 뭐지!
> Sign Extension - MSB와 같은 비트값으로 sign extension을 시행한다.
# Unsigned Power-of-2 Multiply/Divide with Shift
# Signed Power-of-2 Multiply/Divide with Shift
[2. Data Representation - float]
# 시험에 나올 수도 있을거 같아! 10진수 -> 2진수 변환
# Floating Point representation
실수를 '부동소수점'이라는 방식을 통해 표현
s: 부호비트
E: 지수/ exp: E를 인코딩
M: 유효숫자/ frac: M을 인코딩
# 인코딩 방법 - exp값에 따라 세가지가 있다.
1. 정규화 방법 (exp가 0, 1이 아닐 때)
시험에 나올 것 같아! 변환방법
2. 비정규화 방법(exp가 0일 때) - 0에 가까운 굉장히 작은 숫자 표현
이 인코딩은 floating point에서 0을 표시하기 위한 수단이다. floating point에서는 다른 정교한수는 표현해도 0을 표현할 수 없기에 0에 가까운 수를 표현하도록 인코딩한다.
3. 특수 값(exp가 111....1일 때)
> Dynamic Range
> Rounding
# Toward-zero: 소수점 아래를 삭제
# Round-down: 내림
# Round-up: 올림
# Round-to-even: .5(half way)여서 반일때는 짝수로 round한다.
# 시험에 나올지도!
10.00011에서 011은 맨 앞 값이 0이니까 그냥 내리면 된다. -> 10.00
10.00110에서 110은 맨 앞 값이 1이고, 뒤에 추가적으로 1값이 더 있으니까 올리면 된다. -> 10.01
10.11100에서 100은 맨 앞 값이 1이고, half-way이기 때문에 짝수가 되도록(0이 되도록) 만든다. -> 11.00
10.10100에서 100은 맨 앞 값이 1이고, half-way이기 때문에 짝수가 되도록(0이 되도록) 만든다. -> 10.10
[[Machine-level-programming]]
[4. Machine-level-programming_Basic]
> Disassembling(기계어 -> 어셈블리어) Object Code: objdump -d sum (sum: 기계어 코드를 담은 실행 파일)
> Alternate Disassembly: gdb sum
> 86-64 Integer Registers
#시험에 나올것 같아!
# Arithmetic Operations
# Arithmetic Operation
[5. Machine-level Programming_procedure]
[6. Machine-level Programming_data]
[7. Machine-level Programming_advanced]
> Memory Management
> Buffer Overflow
; when exceeding the memory size allocated for an array
It's the #1 technical cause of security vulnerabilities
# gets(); buffer overflow를 발생시킬 가능성이 높아서 사용 지양
'소프트웨어 전공 > 시스템 프로그램' 카테고리의 다른 글
[System Program] [7] [Virtual Memory] (0) | 2021.05.31 |
---|---|
[System Program] [9] Concurrent Programming (0) | 2021.05.31 |
[System Program] [5] Exceptions and Processes (0) | 2021.05.30 |
[System Program] [4] Cache Memory (0) | 2021.05.30 |
[System Program] [3] Memory Hierarchy (0) | 2021.05.29 |