---------------------------break
list 나 l을 사용하면 프로그램이 10줄씩 보여준다.
특정함수의 list를 보고 싶으면
l minus 또는 list minus 하면 minus함수의 리스트가 보인다.
----------------------------------
disas minus 이렇게 하면 minus 함수가 어셈블리 어로 보인다.
----------------------------------
info reg 하면 레지스터 의 값들이 쭉 보인다.
info break 하면 브레이크의 값들이 쭉 보인다.
-----------------------
라인이나 함수명을 가지고 브레이크포인트를 잡을수있다.
혹은 쓰레드가 있으면 쓰레드넘버를 넣어줄수있고
break 잡는 방법
 break 11 if i==0
 i가영일때 11번 라인에서 멈춰라
 이프안쓰면 11번라인에서는 항상 멈춘다
 braek sum_all이라고하면 sum_all이라는 데서 멈춘다.
Continue하면 브레이크 하고 다시 실행이고
break 해서 또 브레이크 포인트 를 잡아줄수있다.
info braek하면 현재 브레이크 포인터가 설정된되가 보인다.
브레이크 포인트 삭제방법은
delete 2 이런식으로 쓰면 2번 브레이크 포인트 삭제된다.
전체 브레이크 포인트 삭제하고 싶으면 del한다
------------------------
인자를 줘서 계산하는 프로그램이 있으면 r 5 5  또는 run 5 5 이렇게 주면 실행된다.
--------------------------------
bt는 백트레이션이다.
----------------------------------------------
ni 또는 nexti
next i이면 어셈블리 레벨에서 1명령씩 실행한다.
그냥 next는 C에서 다음명령 1개씩 실행한다.





$esp는 스택 포인트를 가르킨다.
     x/10x 16진수로 출력하는데 10개의 데이터를 출력하겠다라는것이다.
        ㅇㅖ)  x/10i 어셈블로출력
                 x/10c문자로출력
                 x/10d 10진수로출력
그러므로 스택의 내용을 출력하고 싶으면
x/10x  $esp
이렇게 하면 스택의 내용이 보인다.


메인에다가 printf를 호출을 하면
main(){
 printf();
 scanf();
 a=10;
}
main에서  프린트 에프를  만나면  실행흐름이 프린트 에프로간다.
프린트에프가 종료가 되면 메인으로 돌아간다.
메일으로 돌아가서 다시 쭉 코드가 실행된다.
스캔에프로가서 스켄에프종료되면다시 메인으로 간다.
이게 자동적으로 되는게 아니라 정보를 스택으로 저장을한다.
스캔에프를 호출을 하면 스캔에프로 갈주소를 저장을 한다.
프린트에프가종료됬을때 다시 되돌아가야할주소가 저장된다
리턴어드레스이다.
일반적으로 C프로그램에서는 메모리 구조를 다음과 같이 사용한다.
----------------
. 배열               |
. 배열               |
. 배열               |  ↓이쪽으로 증가   
. 배열               |
..................... .|
. 지역변수들      |
.지역변수들       |
.지역변수들       |↑이쪽으로 증가  
.지역변수들       |
----------------
SFP                 |
----------------
RET                 |
----------------
스택에 저장될 리턴어드레스가 바뀌면 이상한데로간다.
배열이 많아 지면 지역변수영역도 먹고 RET도 건들게 되서
알수없는 이상한데로 점프를한다.
메인함수도 마찬가지로 처음에생성될때 RET갑도있다.
$eip레지스터는 pc값과 같다고보면된다.

인텔엑스팔육게열의 에셈블리를 사용할때 사용하는
스택 프레임포인터가 SFP가 ebp이다.
메인에서 a라는 함수를 호출했어요 a라는 함수에서 b라는 함수를 호출했어요
그러면은 스택에 어떻게 쌓이냐면은 이런식으로
a라는 함수에서 i라는 지역변수를 참조하기 위해서는 stack포인터가지고는 안되고
스택베이스포인터가있어야된다.->SFP
------
j       |   주소값 72
------
i       |   주소값 76
------->   a함수가 호출하면 ebp가 일로 옮겨가서 ebp를 기준으로 변수를 참조하기 때문에
        |      a함수안에서의  변수만참조가능
SFP  |   주소값 80 ( 96저장ebp가 돌아가야 할 주소)  
------->스텍포인터가 필요하고 베이스포인터가 필요하다
RET  |   주소값 84  (a함수가 호출될때 돌아가야할 주소 100이 바로 저장된다)
------
i       |   주소값 88
-----
i       |   주소값 92
------- >    지역변수가 할당되기 직전에 $ebp가있다.가르키고있다.
        |        ebp를 기준으로 삼아서 ebp-4를 빼주면 i에 접근할수있다.-8하면  j접근
SFP  |  주소값 96               (현재 스택의 주소가들어간다)
------
RET   | 주소값100  main  (실제 함수의 코드영역의 주소가들어가고)
------

*리턴어드레스는 펑션에서 콜할때 자동적으로 저장되어잇다

*메인의 ebp를 스택에 저장을 하고 ebp를 현재 스택 포인터를 갱산한다. esp로

      리눅스  |  2007. 9. 11. 19:49




sprintf() 추천해주는함수
fgets() 추천해주는 함수
--------------강사가 추천해주는 함수-----------

char  *fgets(char *s, int size, File stream);
stdin  표준입력으로 문자열로 받고 싶다.
STDIN 파일 디스크립터를 사용할때
파일을 다루는데는 디스크립터랑 구조체 포인터로 구분이된다.

fread(void  *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite 파일스트림의 구조체 포인터를 사용

read
wirte 이것은 파일의 디스크립터를 사용한다.
 파일 디스크립터의 넘버로 사용
 인티져형의 파일 디스크립터 넘버를 사용한다.
f로된 것을 사용 하면 좀더 다양한 함수를 사용할수있다
그냥함수로 사용하면 저수준의 함수밖에 사용하지 못한다.

fscanf를 못밑으면
fgets로 한줄을 읽어온다음에
strtok를 이용해서 단어별로 끈고
끈은 문자열중에서 123은
atoi등 이용해서 인트형변환하고

123.456은
atof를 이용하거나
strtod등을 이용해서 float으로 저장하여
처리하는것이 깔끔하다

파일스트링과 파일 디스크립터의 차이를 본다
fprintf(stdout, "test.. \n");
write(STDOUT,"TEST. \n", 8);  //unistd.h
write(1,"TEST. \n", 8);  //unistd.h
STDOUT같은것은  /usr/include에정의 되어있다 .grep써서 찾아보면됨
STDOUT은 인티져로 1이다


      c 언어  |  2007. 9. 11. 18:06




다수의 소스 파일로 구성된 큰프로그램중 어떤파일이 변경되어 재 컴파일이 필요한지
판단해서 프로그램 재구성작업을 효율적을 수행하는 역할을 한다.
make는 수정된것을 안다 수정시간등으로 그래서 수정된 파일만 컴파일을 해준다.
예를 들어서  a.0의 수정시간보다 a.c 의 수정시간이 최신이면 다시 컴파일을 해준다.

make파일의 기본적인 형태
먼저 타겟을 적는다 예를 들어서 컴파일을 해서 Test라는 실행 파일을만들고 싶으면
Test 가 make에들어간다.
예) make test a.c b.c c.c
 여기 한줄아래 대상파일을 실행하기 위한 명령을 아래적는다
 위에 공백은 탭키로 해야지만 위에 줄이 명령이라고 인식한다.
예)
test:: test.c
 gcc test.c -o test
clean:                                            => make clean이라는 명령을 주었을때 이것이 실행이된다. 쉽게 말해서 라벨을 찾아서  실행명령을 수행한다.
 rm test.o
======================
의존성
대상과 대상을 생성하는데 필요한 소스 파일의 관계

사용자 삽입 이미지

사용자 삽입 이미지

test::test test1.o test2.o test3.o
test1.o:test1.c a.h
test2.o:test2.c.a.h b.h
test3.o:test3.c b.h c.h
보통 이런식으로 해줘야 다시 재빌드 하는 작업이 줄어든다.
test 1,2,3은 아래 파일에 의해서 만들어지고 test는 test1.o test2.o test3.o 에 의해서 만들어진다.
test: test1.o test2.o test3.o
 gcc -o test test1.o test2.o test3.o
test1.o: test1.c a.h
 gcc-c test1.c
test2.o: test2.c a.h b.h
 gcc -c test2.c
test3.o: test3.c b.h c.h
 gcc -c test3.c
-----------------------------------------------------
make
치면 지가알아서 컴파일
메이크파일은 Makefile이렇게 첫문자를 항상대문자로 만들어야한다.
긴명령을 쓸려면 깔끔하게 보이게 \을 사용해도된다.
test: test1.o \
 test2.o\
 test3.o\
 test4.o\
이런식으로 써도 된다.
------------------------------------------------------------------------------------------------
셸에서는 ;을 사용해서 깔끔하게 보이게 쓸수도 있다.
-------------------------------------------
매크로정의
M_NAME = value
사용할땐 $(M_NAME)

매크로 치환
OBJF=test1.o test2.o test3.o
SRCS=$(OBJF:.o=. c)
-----------------------------------------------------------------------------------------------------------------------
암시적인 규칙을이용한다.
01 OBJF = test1.o test2.o test3.o
02 test: $(OBJF)
03 ??gcc -o $@ $(OBJF)
04 clean:
05 ??rm $(OBJF)

      리눅스  |  2007. 9. 11. 18:05



sokoban's Blog is powered by Daum & Tattertools