2013/10/31 컴시아 6주차
제3장 프로그램의 기계수준 표현
시스템의 설계에 있어 Instruction set을 설정하는 것이 첫 번째 작업.

#1.
어셈블리어는 단지 기계어 코드를 사람이 읽기 쉬운 형태로 바꾼 것에 불과하다.
최신 컴파일러는 효율적인 어셈블리 코드를 생성하기 때문에, 굳이 프로그래머가 어셈블리 코드를 작성할 필요는 없다.

#2.
다만, 고급 언어는 컴퓨터 시스템의 내부적 구현을 알기 어려움.
즉, 어셈블리 코드를 통해 시스템을 이해하고 이를 통해 프로그램 성능 최적화, 에러 분석, 보안 이슈 해결 등이 가능하다.

#3. 인텔  x86 프로세서
Evolutionary Design: 8086(1978년) 프로세서까지도 호환성을 유지할 정도로 새로운 기능의 추가와 기존 기능의 유지가 이루어지고 있다.
(ADD, ADD2, ADD3 이런 식으로..)
CISC[Complex Instruction Set Computer] 구조의 대표 주자. (엄청난 명령어를 제공하고 있다) 
RISC보다는 성능이 낮음. (하지만 높은 클럭, 최적화 기술을 통해 보완)
// Intel Instruction set reference를 보면 굉장히 두껍다.
// AMD도 CISC이다. Intel clone일 뿐.

#4. 인텔  x86 프로세서의 발전 과정
Moore의 법칙은 상식으로 알고 가자. (10년간 트랜지스터의 수가 두 배씩 증가할거라고.. 하지만 실제론 26개월마다 2배)

#5. 인텔 프로세서의 아키텍쳐
MMX: Multi Media eXtension
SSE: 

#6. 용어 정의
아키텍쳐 (왜 탭이 안먹지? 불편하군)
명령어 집합 아키텍쳐(Instruction Set Architecture, ISA)
- H/W와 S/W 사이의 인터페이스.
- 시스템의 state와 operation 추상화

#7. 프로그래머 관점에서의 컴퓨터 시스템 구조
PC(Program Counter, %eip): 다음 명령의 주소
레지스터 파일(8개의 정수 레지스터): 프로그램의 데이터/주소 저장
조건 코드 레지스터: 연산의 결과 저장, 조건 분기에 사용
메모리: 바이트의 배열, 코드와 데이터 저장, 프로시저 호출을 위한 스택

#8. 컴파일
리눅스 컴파일 명령
gcc -O1 -o p p1.c p2.c
C Program -> (Compiler, gcc -S) -> Assemble Program -> (Assembler, gcc or as) -> Object Program -> (Linker, gcc or ld) -> Executable program
Object 파일과 Executable 파일의 차이점은 무엇일까?
-Linker가 Static library를 갖다 붙여 주었느냐에 따른 차이
-프로세스로서 메모리에 로딩이 될 수 있느냐에 따른 차이. (주소 지정 가능 여부)
-모든 인스트럭션의 바이너리 표현을 포함하고 있지만 전역 값들의 주소는 채워지지 않음.

#9. Object Code
다른 파일의 코드와 연결 정보는 누락된 상태 (링크를 안해서)
최종 실행 코드와 거의 유사
각 명령어의 이진수 표현

#10. 어셈블리 코드의 이해
Visual Studio에서는 디버거 실행한 상태에서, 디버그 - 창 - 디스어셈블리를 선택하면 된다.
gcc -O1 -S anycode.c --> 대문자 S임에 주의하자!
anycode.s 가 튀어 나온다.
어셈블리에서 % 뒤에 있는 문자는 레지스터의 이름을 뜻한다.
(%ebp)와 같이 괄호가 있는 경우엔 포인터와 같이 역할을 한다.

#11. 목적코드의 역어셈블
linux> objdump -d code.o
Mac> otool -[Option] code.o
Accumlator는 00 00 00 00 혹은 0x0으로 표기된다. (아직 주소가 지정이 되질 않아서)
-Linking 이후
Linux > gcc -O1 -o prog code.o main.c

#12. Disassembly using Debugger
Linux Debugger: gdb prog
<within debugger>: disassemble sum

#13. Assembly code and data type
Data size
- Integer: 1, 2, 4 bytes (save data and memory address)
- Float: 4, 8, 10 bytes
- No array or structure is provided. (No complex data type)

#14. Feature of IA32
Intel word: 16bits (2 bytes) --> for backward compatibility.
32bits == double word, 64bits == quad word.
no long long int is provided. (has compiler compute per 32bits by coding)

#15. Assmebly code and operator
Data move between memory and register
-load: From memory to register
-store: store data from register to memory
-copy: between register and register.
Logical/arithmatic operation
- manipulation of data on register or memory.
flow of control
- Unconditional jump - Calling procedure and moving for return.
- Conditional branch - 조건 명령에 따른 조건부 분기.

저작자 표시 비영리 동일 조건 변경 허락
신고

'NHN NEXT > 시스템 아키텍쳐' 카테고리의 다른 글

Binary Bomb Lab Phase 4 Walkthrough  (0) 2013.12.14
Binary Bomb Lab Phase 3 Walkthrough  (0) 2013.12.14
Binary Bomb Lab Phase 2 Walkthrough  (0) 2013.12.14
BInary Bomb Lab Phase 1 Walkthrough  (0) 2013.12.14
컴시아 6주차  (0) 2013.11.01
Posted by 우너효


티스토리 툴바