이 스터디에서는 가르쳐주신 걸 모든 내용을 문서화하면 이쁨을 받는다고 해서 작성했3

그리고 나중에 내가 쓴 걸 다시 돌아보면서 많은 생각을 하게 만들 것이다.


1주 차에서는 어셈블리어 공부, 어셈블리어 프로그래밍, 핸드레이를 진행하였다.


어셈블리어에는 어마어마한 레지스터들이 있다는 것을 알게 되었다.

하지만 우리가 쓰는 레지스터들은 보통 8개 정도 쓰인다고 한다.


범용 레지스터 (General Resgister)


EAX (AX, AH, AL) - 누적 연산기, 곱셈과 나눗셈 연산에서 자동으로 사용한다.

EBX (BX, BH, BL) - 베이스 레지스터, 특정 주소를 지정한다.

ECX (CX, CH, CL) - 카운터 레지스터, 반복 카운터로 사용됨.

EDX (DX, DH, DL) - 데이터 레지스터, 입 출력 연산에서 반드시 간접 주소로 지정에 사용됨.

EBP (BP) - 베이스 포인터, 스택의 데이터에 접근하기 위해 사용됨

ESP (SP) - 스택 포인터, 스택 최상부의 오프셋을 가리킨다.

ESI (SI) - 읽기 인덱스, 데이터 조작, 복사 시에 소스 데이터의 주소가 저장됨

EDI (DI) - 쓰기 인덱스, 복사 시에 목적지의 주소가 저장됨

EIP - 명령어 포인터 레지스터, 실행할 다음 명령어의 주소를 포함

EFLAGS - CPU의 동작을 제어하거나 CPU 연산의 결과를 반영



AH, AL 중 H 는 High 을 뜻하고 L는 Low를 뜻한다.


이제 어셈블리어에 레지스터에 대해서는 잘 끄적인 것 같으므로 다음으로 넘어가보자.


일단 첫 번째로 write를 구현을 해보라고 했다.


이에 대해서는 시스템 콜을 사용해야한다.


시스템 콜이란 커널의 자원을 사용자가 사용 할 수 있도록 만들어 놓은 고급 API? 같은 것이다.


사용자 프로세서가 시스템 콜을 요청하면 제어가 커널로 넘어간다.

커널은 내부적으로 각각의 시스템 콜을 구분하기 위해 기능 별로 고유 번호를 할당해 놓는다.

이것이 바로 시스템 콜 넘버라고 한다.


그에 비해 라이브러리 함수는 사용자들이 많이 사용할 것 같은 기능들을 미리 만들어놓은 것이다.

하지만 이 라이브러리 함수는 사용자 모드에서 실행된다.


그렇다면 우리는 넘겨줘야되는 것은 (system_call, fd, &buf, nbyte) 가 되시겠다.


이제 어셈블리어 코드를 작성해보자.


어셈블리어에서는 지시자들이 있다.


아직 지금까지 내가 써본 지시자들은 .globl, .string 뿐이다.


이에 대해 설명하자면 

.globl (global) <Symbol> : 심볼을 외부 참조가 가능하게 한다.

.string : 오브젝트 파일에 문자열을 복사(?) 

.data : 초기화된 데이터 섹션




지금 알려준 것은 함수에서라고 한다.


카운트를 0으로 초기화해준 뒤에


가져온 eax 를 바이트 단위로 bl 8bits 레지스터에 넣는다. (?) 맞나?


그 뒤에 바이트 단위로 %bl 과 null을 비교를 하고


같을 경우 끝으로 점프한다


아닐 경우 ecx ++, eax++ 하며 루프를 돈다.


※ 아 (%eax) 를 하면 메모리 주소의 값을 의미한다고 한다.

ex)

%eax = 0xffffe008


Memory :

0xffffe008: 0xabcdef


%eax 는 0xffffe008 

(%eax) 는 0xabcdef 

라고 한다.


그렇게 엔딩에 가고 카운트를 eax 에 넣는다.

eax 레지스터는 리턴 값으로 자주 쓰이는 것 같아 보인다.



_M#]


위에는 전에 썻던 글인데 

왜 이렇게 썻는지 모름... ㅂㄷ;;


고로 버리기에는 아까우니 요약에다가 쑤셔넣기 !


어여튼 어셈 코드는 이러하다.


입력을 받고 esi 에 넣는다.


글자 길이를 카운트를 책임질 ecx 를 0으로 초기화해줌


(esi) 글자를 1글자 씩 bl에 넣음


cmpb로 null과 1글자 씩 비교함


je 같을 경우에 .end 로 점프


아닐 경우 ecx ++ 와 다음 글자를 비교하기 위해 esi ++


그리고 loop 로 다시 점프


그리고 null일 경우 end 로 가서 

eax에 ecx를 넣고 끝


함수는 보통 eax로 리턴을 한다고 한다. (정확한 것은 아님)


_M#]





+ Recent posts