컴퓨터 구조 실습 [1]

2023. 9. 11. 23:46컴퓨터/컴퓨터 구조

[목차]

1.           자료형 크기 확인 [1]

2.          오버플로우 재현 [1]

3.           비트연산 c언어 프로그램 작성 [1]

4.          특정 위치의 비트를 끄는 코드 만들기[1]

5.           GCC Compiler [2]

6.          GDB Debuger 이용한 디버깅 [1] [2]

 

데이터 표현 실습

-       자료형 크기 확인 (sizeof)

각각의 자료형의 크기를 알아보았다. MSDN, cplusplus 통해서도 자료크기를 확인할 있다.

 

-       오버플로우 재현

Char형은 -127~126, 256개의 숫자가 표현 가능하다. CHAR_MAX보다 1큰수를 출력하였더니 오플러우 되어 -128 값이 나왔다.

 

다음으로는 리눅스 커널에서 해당 파일을 실행했을 각각의 명령어에서 나오는 결과값을 적어보았다.

Gdb?
GNU에서 나온 디버깅 프로그램이다.
GDB 컴퓨터 프로그램의 실행을 추적하고 변경하기 위한 광범위한 기능을 제공한다. 사용자는 프로그램의 내부 변수 값을 모니터링하고 수정할 있으며, 프로그램의 정상적인 동작과 독립적으로 함수를 호출할 수도 있다 -wikipedia(GNU Debugger)

 

gcc -o main main.c -g
(gdb) b main
(gdb) r
(gdb) n
(gdb) p/t value
(gdb) p value
디버깅 옵션인 -g 컴파일
중단점(breakpoint) 사용하기
프로그램 수행
현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어감
출력 형식의 지정(p/t value: value값을 이진수(t) 출력)
변수값(value) 출력

-       비트연산 C언어 프로그램 작성해서 확인하기

#include <stdio.h>

//특정 위치에 비트 값이 1인지 확인하는 함수
int is_bit_set(unsigned char value, int position) {
    return (value & (1 <<position)) != 0;
}

unsigned char set_bit(unsigned char value, int position) {
    return value | (1<<position);
}

int main() {
    //unsigned 양수만 표시 가능 0~255
    unsigned char value = 0b00001000; //gcc extension

    //3번째 비트가 설정되어 있는지 확인
    if(is_bit_set(value, 3)) {
        printf("3rd bit is set!\n");
    } else {
        printf("3rd bit is not set!");
    }

    //2번째 비트를 설정
    value = set_bit(value, 2);
    printf("Value after setting 2nd bit: %d\n", value);
    return 0;
}

main 함수에서 is_bit_set 함수와 set_bit 함수를 사용한다.

1. is_bit_set 함수는 특정 포지션에 비트가 들어있는지 확인하는 함수이다.

1<<position이 0000 0001 비트를 position 숫자만큼 shift하고 남은 자리는 모두 0이기 때문에

(예시. position=3, (1<<position) --> '0000 1000')

& 연산자를 사용할 경우 position 자리에 1이 존재하지 않는 경우 0000 0000으로 return 값이 0이 된다.

 

2. set_bit 함수는 postion잘에 bit를 추가하는 함수다.

위와 같이 (1<<postion)값을 value값과 |(or)연산자로 계산할 경우 position 자리에 1이 있을 수 밖에 없다.

-       특정 위치의 비트를 끄는 함수 만들기

#include <stdio.h>

unsigned char clear_bit(unsigned char value, int position) {
    return value & ~(1<<position);
}

int main() {
    //unsigned 양수만 표시 가능 0~255
    unsigned char value = 0b01010101; //gcc extension

    value = clear_bit(value, 2);
    printf("Value after clearing: %d", value);
}

특정 위치에서 비트를 끄는 프로그램을 코딩을 해 보자

01010101에서 3번쨰 1을 지워 01010001로 만들고자 한다.

해당 프로그램은 아래 순서로 진행된다.

1. 1(0000 0001)을 비트를 지울 위치만큼 shift시킨다. (ex. position = 2, 0000 0001 --> 0000 0100)

2. shift시킨 비트를 ~(NOT)연산자를 통해 해당 position을 제외한 부분을 1로 만들어준다.

(ex. 0000 0100 --> 1111 1011)

3. value값과 &연산자를 통해 계산하면 position 부분은 0으로 바뀌고 다른 위치의 비트 값은 본래 value의 값과 같아진다.

(ex. 0101 0101 & 1111 0111 --> 0101 0001

'컴퓨터 > 컴퓨터 구조' 카테고리의 다른 글

컴퓨터 구조 실습[2]  (0) 2023.09.12