카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/08

C 지역변수, 전역변수

#include <stdio.h>

// Neede for exit
#include <stdlib.h>
#include <string.h>

int globalVar = 0;

int addTwoInts(int num1, int num2){
return num1 + num2;
}

void changeVariables(){
int age = 40;
printf("age inside of function = %d\n\n", age);
globalVar = 100;

printf("globalVar inside of function = %d\n\n", globalVar);


}

int main(void){
printf("\n");

int total = addTwoInts(3, 4);
printf("The Sum %d\n\n", total);

int age = 10;
globalVar = 50;

printf("age before a call to the function = %d\n\n", age);
printf("globalVar before a call to the function = %d\n\n", globalVar);

printf("age after a call to the function = %d\n\n", age);
printf("globalVar after a call to the function = %d\n\n", globalVar);


changeVariables();

}

C 문자열 처리 strcmp, strcat, strlen, strncpy

#include <stdio.h>

// Needed for exit()
#include <stdlib.h>

// Needed for strcmp, strcat, strlen, strlcpy -> strncpy
#include <string.h>

void main(void){
printf("\n");

char wholeName[12] = "Derek Banas";

int primeNumbers[3] = {2, 3, 5};
int morePrimes[] = {13, 17, 19, 23};

printf("The first prime in the list is %d\n\n", primeNumbers[0]);

char thirdCity[] = "Korea";
char yourCity[30];

printf("What city do you live in? ");
fgets(yourCity, 30, stdin);
printf("Hello %s\n\n", yourCity);

for(int i = 0; i < 30; i++){
if(yourCity[i] == '\n'){
yourCity[i] = '\n';
break;
}
}
printf("Hello %s\n\n", yourCity);
printf("Is your city Kores? %d\n\n", strcmp(yourCity, thirdCity));

char yourState[] = ", Korea";
strcat(yourCity, yourState);

printf("You live in %s\n\n", yourCity);

strncpy(yourCity, "Jera NamDo HeaNam", sizeof(yourCity));
printf("New City is %s\n\n", yourCity);
}

C 문자 상수 fgets

#include <stdio.h>

// Needed for exit()
#include <stdlib.h>

void main(void){
printf("\n");

char wholeName[12] = "Derek Banas";

int primeNumbers[3] = {2, 3, 5};
int morePrimes[] = {13, 17, 19, 23};

printf("The first prime in the list is %d\n\n", primeNumbers[0]);

char thirdCity[] = "Korea";

char yourCity[30];

printf("What city do you live in? ");

fgets(yourCity, 30, stdin);

printf("Hello %s\n\n", yourCity);

for(int i=0; i < 30; i++){
if(yourCity[i] == '\n'){
yourCity[i] = '\n';
break;
}
}
printf("Hello %s\n\n", yourCity);
}

C 배열

#include <stdio.h>

// Needed for exit()
#include <stdlib.h>

void main(void){
printf("\n");

char wholeName[12] = "Derek Banas";

int primeNumbers[3] = {2, 3, 5};

int morePrimes[] = {13, 17, 19, 23};

printf("The first prime in the list is %d\n\n", primeNumbers[0]);

char city[7] = {'K', 'h', 'i', '\0'};

char thirdCity[] = "Korea";
}

C MMi 구조 switch case

#include <stdio.h>

// Needed for exit()
#include <stdlib.h>

void main(void){
int whatToDo = 0;

do{
printf("\n");
printf("1. What time is it?\n");
printf("2. What is todays data?\n");
printf("3. What day is it?\n");
printf("4. Quit\n");

scanf(" %d", &whatToDo);
}while(whatToDo < 1 || whatToDo > 4);
switch(whatToDo){

case(1) : printf("print the time");
  break;
case(2) : printf("Print the date");
  break;
case(3) : printf("Print the day");
  break;
default : printf("Bye Bye");
  exit(0);
  break; 

}

C MMI 인터페이스 if_else

#include <stdio.h>

// Needed for exit()
#include <stdlib.h>

void main(void){
int whatToDo = 0;

do{

printf("\n");
printf("1. What time is it?\n");
printf("2. What is todays data?\n");
printf("3. What day is it?\n");
printf("4. Quit\n");

scanf(" %d", &whatToDo);
}while(whatToDo < 1 || whatToDo > 4);

if(whatToDo == 1){
printf("print the time\n");
}else if(whatToDo == 2){
printf("print the date\n");
}else if(whatToDo == 3){
printf("print the day\n");
}else{
printf("Bye Bye\n");
exit(0);
}
}

C 카운트 증가 값 출력

#include <stdio.h>

void main(void){
printf("\n");

for(int counter = 0; counter <= 40; counter++){
if((counter % 2) == 0) continue;

printf("%d ", counter);
}
printf("\n");
}

// compile : gcc -std=c99 program_file_name.c -o execution_name 

C gcc 라이브러리 버전 지정 컴파일

#include <stdio.h>

void main(){
printf("\n");

for(int counter = 0; counter <= 20; counter++){
printf("%d ", counter);
}

// gcc -std=c99 programname.c -o Execution
}

C 입력된 값 확인 do ~ while

#include <stdio.h>

int size_shirt(){
printf("\n");

char sizeOfShirt;

do{
printf("What Size of Shirt (S, M, L): ");
scanf(" %c", &sizeOfShirt);
}while(sizeOfShirt != 'S' && sizeOfShirt != 'L' && sizeOfShirt !='L');
}

void main(){
size_shirt();
}

C secret number 입력

#include <stdio.h>

int select_number(){
printf("\n");

int secretNumber = 10, numberGuessed = 0;

while(1){
printf("Guess My Secret Number: ");
scanf(" %d", &numberGuessed);

if(numberGuessed == secretNumber){
printf("You Got It\n");
break;
}
}
}

void main(void){
select_number();
}

C bit 처리

#include <stdio.h>

int bits(){
printf("\n");

int numberHowBig = 0;

printf("How Many Bits? ");
scanf(" %d", &numberHowBig);
printf("\n\n");

// 0 : Print what is given
// 1 : print what is given
// 2 : 1 + 2 = 3 11
// 4 : 7 + 8 = 15 1111

int myIncrementor = 1, myMultiplier = 1, finalValue = 1;

while(myIncrementor < numberHowBig){
myMultiplier *= 2;
finalValue = finalValue + myMultiplier;
myIncrementor++;
}

if((numberHowBig == 0) || (numberHowBig == 1)){
printf("Top Value: %d\n\n", numberHowBig);
} else {
printf("Top Value: %d\n\n", finalValue);
}
}

void main(void)
{
bits(); // input 31 -> How Many Bits? 31
        // // input 32 -> Top Value: -1

}

C 지원하는 자료형 크기

#include <stdio.h>

int main(void){
printf("\n");

printf("A char takes up %ld bytes\n\n", sizeof(char));
printf("A int takes up %ld bytes\n\n", sizeof(int));
printf("A long int takes up %ld bytes\n\n", sizeof(long));
printf("A float takes up %ld bytes\n\n", sizeof(float));
printf("A double takes up %ld bytes\n\n", sizeof(double));
}

C 논리 연산, logic operator

#include <stdio.h>

int logic_call(){
printf("\n");

// Missed less then 10 days work AND
// Has over 30,000 OR
// Signed up more then 30 new customers

int bobMissedDays = 8, bobTotalSales = 24000,
    bobNewCust = 32;

if(bobMissedDays < 10 && bobTotalSales > 30000 || bobNewCust > 30){
printf("Bob Gets a Raise\n\n");
}else{
printf("Bob Doesn't Get a Raise\n\n");
}
}

int ternary_operator(){
printf("\n");

int custAge = 38;

char* legalAge = (custAge > 21) ? "true" : "false";

printf("Is the customer of legal age? %s\n\n", legalAge);

int numOfProducts = 10;
printf("I bought %s products\n\n",
(numOfProducts > 1) ? "many" : "one");

}

void main(void){
// && - and
// !! - or
// ! - not !0 = 1, !1 = 0;

int custAge = 38;

if(custAge > 21 && custAge < 35)
printf("They are weclome\n\n");
else printf("They are not welcome\n\n");

printf("! turns a true into false : %d\n\n", !1);

logic_call();

ternary_operator();
}

C 조건문 comparison operator

#include <stdio.h>

void main(void){
printf("\n");

int num1 = 1, num2 = 2;

printf("Is 1 > 2 : %d\n\n", num1 > num2);

if(num1 > num2){
printf("%d is greater then %d\n\n", num1, num2);
} else if(num1 < num2){
printf("%d is less then %d\n\n", num1, num2);
} else {
printf("%d is equal to %d\n\n", num1, num2);
}
}

gimp 열기, 저장, 자르기, 회전, 뒤집기

1. 파일 크기 조정
웹에 이미지 정보를 업로드 시 크기 제한이 있을 때 사용한다.
즉, 크기 제한 정책이 있는 문서의 형식일 때 크기 조절이 필요하다.

파일 열기
파일→  열기  → 이미지 경로 이동 호출
단축키 Ctrl + O

image → scale image
이미지 → 이미지 크기 조정 

width 너비: 1000
height 높이: 자동 변경
Save 크기 조정(S)
크기 조정 화면 확인 생성

원본 이미지 크기 복원
image → scale image
이미지 → 이미지 크기 조정 
단축키 : art + I → S

width 너비: 1000
height 높이: 자동 변경
Save 크기 조정(S)

파일 다른 이름으로 저장하기
File → export
파일 → 다른 이름으로 내 보내기
단축키 :  Ctrl + Shift + E

내보내기(export) 버튼 선택

이미지 변경 왜곡 최대 최소화
내보내기(export) 버튼 선택

2. 이미지 자르기
Tool → Transform Tools → Crop
도구 → 변형 도구 → 잘라내기
단축키 : Shift + C

작업 취소
Edit → Undo Crop Images
편집 → 이미지 잘라내기 실행 취소
단축키 : Ctrl + z

3. 화면 회전
Tools → Transform Tools → Rotate
도구 → 변형 도구 → 회전
단축키 : Shift + R

4. 뒤집기(반전)
Tools → Transform Tools → Flip
도구 → 변형 도구 → 뒤집기
단축키 : shift + F

기능
단축키
파일 열기
Ctrl + O
크기 조정
Art + I + O
다른 이름 저장
Ctrl + Shift + E
이미지 자르기
Shift + C
작업 취소
Ctrl + z
화면 회전
Shift + R
뒤집기
hift + F

ubuntu18.04 한글 설정


한글 입력 snap, flatpak 한글 입력 안됨.


우분투 기본 환경: 그놈 데스크톱 ibus-hangul 입력기 사용


우분투 처음 설치 후 설정 변경
윈도우 키 → setting → 지역 및 언어 → 입력 소스
한국어 (101/104) 키보드 삭제
영어 삭제
한국어(Hangul) 추가


ibus-hangul 특정 소프트웨어 동작 하지 않음
윈도우 키 → setting → 지역 및 언어 → 입력 소스
한국어(Hangul) 삭제
한국어 (101/104) 키보드 추가


sudo apt-add-repository ppa:hodong/nimf
sudo apt update
sudo apt install nimf nimf-libhangul
im-config -n nimf

재부팅 또는 로그아웃

asm 64bit Sections Labels "Start" Label Global 정리

Sections
    • 모든 x86_64 어셈블리 파일에는 ".data"섹션, ".bss"섹션 및 ".text"섹션의 세 섹션이 있다.
    • 데이터 섹션은 초기화 된 데이터가 컴파일되기 전에 정의되는 곳이다.
    • bss 섹션은 나중에 사용할 수 있도록 초기화 하지 않은 데이터가 할당되는 섹션이다.(0으로 초기화 된 값은 여기에 위치한다)
    • 텍스트 섹션은 실제 코드가 있다.

Labels

    • "레이블"은 코드의 일부에 레이블을 지정하는 데 사용된다.
    • 컴파일시 컴파일러는 레이블이 메모리에 있을 위치를 계산한다.
    • 나중에 레이블의 이름이 사용될 때마다 컴파일러가 해당 이름을 메모리의 위치로 대체한다.

“Start” Label

    • "_start"레이블은 모든 프로그램에 필수적이다. (예전 이 사실을 몰라다. 이 부분 때문에 아마 임베디드 쪽에 관심을 같게 된 것으로 보인다.)
    • 프로그램을 컴파일하고 나중에 실행하면 "_start"위치에서 먼저 실행 한다.
    • 링커가 "_start"를 찾을 수 없으면 오류가 발생한다.

Global
    • 링커가 레이블의 주소를 알 수있게 하려면 "global"이라는 단어를 사용한다.
    • 생성 된 오브젝트 파일에는 "global"으로 선언 된 모든 레이블에 대한 링크가 포함된다.
    • 현재 예제에서 사용되는 코드가 제대로 링크 되어야 하므로 "_start"를 전역으로 선언 한다.

asm 64bit sys_write


Argument Type Argument Description
File Descriptor
0(standard Input)
1(standard Output)
2(standard Error)
Buffer Location of string to write
Count Length of string

시스템 호출 항목

Syscall ID ARG1 ARG2 ARG3 ARG4 ARG5 ARG6
sys_read 0 #filedescriptor $buffer #count









레지스터에 의한 시스템 호출 입력

Argument 인수 Registers
ID rax
1 rdi
2 rsi
3 rdx
4 r10
5 r8
6 r9

"Hello, World! \ n"라고 쓰고 싶다고 가정 한다.

Syscall rax rdi rsi rdx r10 r8 r9
sys_read 0 #filedescriptor $buffer #count









Syscall rax rdi rsi rdx r10 r8 r9
sys_read 1 #filedescriptor $buffer #count









Syscall rax rdi rsi rdx r10 r8 r9
sys_read 1 1 $buffer #count









Syscall rax rdi rsi rdx r10 r8 r9
sys_read 1 1 ADDR #count











시스템 호출
    • 시스템 콜은 프로그램이 커널에 서비스를 요청할 때 요구된다.
    • 운영 체제마다 다른 커널을 사용하기 때문에 시스템 호출은 시스템에 따라 다르다.
    • 모든 syscall은 그들과 관련된 ID(숫자)를 가지고있다.
    • Syscalls은 인수, 즉 입력 항목을 사용한다.

레지스터에 의한 시스템 호출 입력

Argument 
Registers
ID
rax
1
rdi
2
rsi
3
rdx
4
r10
5
r8
6
r9


시스템 호출 항목
Syscall
ID
ARG1
ARG2
ARG3
ARG4
ARG5
ARG6
sys_read
0
#filedescriptor
$buffer
#count








sys_write
1
#filedescriptor
#buffer
#count






sys_open
2
$filename
#flags
#mode






sys_close
3
#filedescriptor










...













Pwritev2
328
















64bit ASM Register define

레지스터는 일시적으로 메모리를 보유하고있는 프로세서의 이다.
x86_64 아키텍처에서 레지스터는 64 비트를 유지한다. 
이는 각 레지스터가 다음 값을 가질 수 있음을 의미한다.
    • Unsigned: 0                        ~ 18,445,744,073,709,551,616
    • Signed: -9,223,372,036,854,775,808 ~  9,223,372,036,854,775,807




레지스터: CPU가 사용하려고 가지고 있는 데이터
eax: 계산에 대한 저장을 하는 데이터
ebx: 베이스 레지스터
ecx: 카운터 레지스터(숫자를 세거나)
edx: 데이터 레지스터
esi: 소스 인덱스 (출발지)
edi: 데스티네이션 인덱스 (목적지)
ebp: 스택의 아랫부분 (베이스) 포인터
esp: 스택의 윗부분 (탑) 포인터
eip: CPU가 다음에 실행할 명령어 주소

10진수 0-9
16진수 0-F 0123456789ABCDEF
4바이트 = 32비트
eax    = 32bit
 ax    = 16bit
 ah/al = 8bit