C 언어의 문자표현
- 문자 : '(작은 따옴표)
- 문자열 : " (큰 따옴표)
- c언어에서는 엄격하게 구별한다.
NASM의 문자표현
- 문자 'hello, World!!!', 10, 00
- 문자나 문자열 모두 '(작은 따옴표)으로 표현한다.
- 즉, 'hello, world!!!'는 문자열 10은 \n 00은 null을 의미한다.
- C언어로 표현하자면 "Hello, World!!!\n"; 와 같은 의미이다.
- 변수라는 개념이 존재하지 않는다.
NASM의 숫자표현
# 위에서 부터, 10진수, 16진수, 8진수, 2진수의 표현방식을 확인할 수 있다. 지금 이 nasm 문서는 2.대 major이기 때문에 실습하고 있는 환경에서 지원하지 않는 것도 있다.
[ data segment에서 데이터를 표현 (initialized data segment) ]
- 레이블(msg) : <white space> 크기(db) <white space> 초기값 형태
- 레이블은 변수 이름이 아니다.
- 변수의 개념과는 다른 개념이며 주소의 또 다른 표현이라고 보면 된다.
# 여기서는 일단 printf 호출하기 전에 인자로 주소값을 받기때문에 msg(주소값)을 푸쉬해주고 있다고 알고 있자. main도 마찬가지로 레이블이고 main은 시작 명령어의 주소를 의미한다. entry point(진입점)라고 불린다. 함수의 인자만큼 push를 해준다.
[ bss segment에서의 데이터 표현 ]
- 레이블: (white space> 단위 <white spce> 크기
- int a;
- char str[1024]; -->
[ text segment에서 명령어 표현 ]
- 레이블 :
명령어
명령어
...
위의 예제를 보면 c언어로 printf(%s %s\n", "hello,", "world!!!");를 어셈블리로 표현한것이다. 각각 msg1 ,msg2, msg3의 주소값을 printf 함수 호출 전에 푸쉬하고 있는 것을 알 수 있는데 여기서 중요한 것은 인자값의 순서가 반대로 들어간다.
[문제]
(0)_(0)(0)_(0)
(=^.^=)(*^.^*)
(_m_m_)(_m_m_) ---->> 이모티콘들을 출력하는어셈블리 프로그램
or
기본 데이터의 단위 (32bit 기준)
단위 크기 C 정의 NASM(문자)
byte 1 char b
word 2 short w
double word 4 int, long(32bit), float, pointer(32bit) d
quad word 8 long long, double q
[ CPU가 사용하는 데이터 저장소 ]
1. 메모리
2. 레지스터(register)
- CPU가 사용하는 고속의 기억 소자
- 특별한 용도를 위해서 사용하는 저장공간
- CPU당 한개의 레지스터만 제공
- 레지스터를 새로 생성, 수정, 삭제 등을 할 수 없다.
https://software.intel.com/sites/default/files/managed/a4/60/253665-sdm-vol-1.pdf --->인텔의 레지스터(첨부1)
https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf ---> 명령어(첨부2)
1). 범용 레지스터
- EAX(Extended Accumulator Register) : Accumulator for operands and results data
- EBX(Extentded Base Register) : Pointer to data in the DS segment
- ECX(Extentded Counter Register) : Counter for string and loop operation
- EDX(Extentded Date Register) : I/O pointer
* Accumulator, Base, Counter, Data Register 다방면에서 사용되지만 각 역할을 잘 알아야 한다.
2). 포인터 레지스터
- ESI( Extended Source Index)
- EDI( Dst. ) --->ESI , EDI 출발과 도착점을 이용해 복사OR반복
- ESP( Stack Pointer)
- EBP( Base Pointer)
- EIP( Instruction Poiner) ---> 다음에 실행할 명령어를 저장 이것을 바꿔준다면 비정상적인 프로그램을 만들 수 있다.
3). 상태 레지스터
http://kimhyun2017.tistory.com/124 //설명 참고.
4). 세그먼트 레지스터
skip
'System Hacking' 카테고리의 다른 글
5일차] 연산자 (사칙연산) (0) | 2018.05.15 |
---|---|
4일차] 명령어(mov, lea) (0) | 2018.05.14 |
2일차] 어셈블리 확인하기 (0) | 2018.05.10 |
1일차] 환경 구축 및 컴파일 과정 (1) | 2018.05.09 |
14~15일차]PAM개념 (1) | 2018.04.30 |