일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- call instruction
- stackalign
- movdqu
- assembly
- effective address
- modrm
- return
- movups
- movaps
- sib
- instruction
- C
- load effective address
- 유효 주소
- struct
- modr/m
- csproj
- OS
- 숏코딩
- compare
- struct반환
- GCC
- C언어
- WPF
- 어셈블리
- NASM
- disassemble
- 운영체제
- C#
- void main
- Today
- Total
목록전체 글 (24)
프로그래밍 잡화점
C# 타입 키워드에는 여러개가 존재한다. 그 중, C/C++, Java에 없는 키워드가 하나 존재하는데, 바로 오늘의 주인공 string이다. C/C++에서는 사용할 수 없는 기능, switch문에 string을 쓰는 방식에 대해 알아보고자 한다. char* 또는 string을 switch에 넣을 수 없는 C/C++과 다르게, C#은 switch에서도 string이 사용가능하다. 곰곰히 생각해보면 의문점이 생긴다. C/C++에서 switch에 string을 못넣는 이유는 당연하다. 왜냐? 비교할 방법이 없기 때문이다. C/C++을 공부해본 사람이라면 알 수 있을 것이다. char* == char*은 문자열 비교가 아니라 포인터 비교란 걸. 물론, strcmp이나 string 클래스에서는 ==를 지원하지만..
들어가기 앞서 - 해당 글은 GCC와 C파일을 기준으로 작성되었습니다. 컴파일러마다 다를 수도 있습니다. 기본적으로 어셈을 배울 때 종료 시에 eax 또는 rax를 0으로 초기화한 후 ret을 해주는 과정을 볼 수 있다xor eax, eax ; = 0 mov eax, 0 ; 위와 같은 코드이다. 그러나 위를 많이 쓰는 경향이 있다. ret ; 종료 지시문 (return)C언어에서 main에서 return 0;을 사용하는 것과 같다고 보면 된다. GCC의 경우 return 0을 안넣어도 알아서 추가해주는 똑똑한 컴파일러다. 그런데 여기서 의문이 생긴다. "만약, main의 반환형이 int가 아니라 다른 타입이면 어떤 일이 발생할까?" 처음에는 int와 void의 비교를 위해서 두 코드를 역어셈 해보았다.두..
먼저 GCC의 최적화 방식을 알아보자. GCC는 상수가 들어왔을 때 해당 값에 따라서 비교하는 명령어(어셈에선 cmp)를 생성하지 않는다. 즉, 다음과 같은 식에서 GCC는 cmp와 je(jump)를 생성하지 않고 바로 내부 코드를 생성한다 if (true) n = 1; mov DWORD PTR [rbp-0x4],0x1 이 방식은 연산자가 존재할 때에도 성립한다. if (true || false); if (true && false); 이 상황에서도 위와 같은 방식이 적용된다. 따라서 if문 내부의 상수의 값이 들어가면 gcc는 이를 먼저 처리하고 그 처리에 따라 뒤에 나올 코드를 넣을지 않넣을지를 결정한다. 추가로 if문 내부 코드가 존재하지 않다면 다음 두가지 경우로 나눠진다. 1. 조건문이 상수인 경..
0은 false고 나머지를 true로 받는 이유는 C 컴파일러 마음대로 이기 때문이다. 역어셈을 해보면 int -> bool하는 과정은 그저 cmp 하나로 작성되어 있음을 알 수 있다 cmp 변수 0x0 (cmp는 compare) 실제로 다음 코드를 역어셈 해보면 재밌는 사실을 알 수 있다 int main() { int n = 5; n = !n; return 0; } 설명 1줄 : 변수에 5를 할당한다 2줄 : 변수랑 0을 비교해서 Zero Flag를 설정한다 3줄 : Zero Flag에 따라서 0또는 1을 al 레지스터에 넣는다 4줄 : al 레지스터의 값을 eax 레지스터에 넣는다 5줄 : n에 eax의 값. 즉 Zero Flag에 따라 생성된 0 또는 1의 값이 들어간다 따라서 n이 0이 아니기 때..
1. for문에서 조건식에 아무것도 안넣으면 무한으로 돌아가는 이유는 역어셈 했을때를 보면 알 수 있다 for에 모든 부분에 (코드블록 내부 포함) 아무 코드도 존재하지 않으면 jmp를 통해서 자기 자신으로 무한 점프를 시도한다 그러나 다른 부분이 하나라도 존재한다면 코드 블록의 시작지점으로 계속 이동하게 된다. (즉, cmp 과정이 존재하지 않는다) (결론적으로 이렇게 되는 이유는 그냥 컴파일러가 무한 반복을 하도록 만들어놨기 때문이다. 로직에서 생긴 일은 아니다) 2. for 조건문에 상수를 박으면 다음과 같은 일이 일어난다 0을 넣은 경우 : 아예 그냥 nop 처리 해버린다 (nop은 아무것도 하지 않는다는 뜻) 0이 아닌 수를 넣은 경우 : 위에 방식처럼 무한 루프를 돌아버린다 = 조건 비교 코드..
백준 숏코딩에 빠진 필자가 들고 온 것은 바로 C# 숏코딩이다. 사실 C# 숏코딩을 해도 C같은 다른 언어(특히 GolfScript)에 못 미치는건 사실이다. 다만, C# 숏코딩은 타 언어에 비해서 경쟁력이 낮아 C# 카테고리에서 1등을 차지하기 쉬울것이다. 그럼 바이트 수를 줄이는 방법을 연구해보자 가장 쉬운 문제인 A+B를 이용해서 구해보자. 1. 변수명은 최대한 짧게! using System; var inp = Console.ReadLine().Split(' '); int x1 = int.Parse(inp[0]); int x2 = int.Parse(inp[1]); Console.WriteLine(x1 + x2); // 141 B 위에 작성한 코드의 변수명은(사실 조금 과장한 감이 없잖아 있다만) 꽤..
리눅스 x 윈도우 듀얼 부팅 후 리눅스에 쓸 배경이 필요해서 직접 파워포인트로 제작해보았다. 착용샷 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
보통 우리가 어떤 언어를 배우던 대부분 재귀 함수라는 것을 많이 접해보았을 것이다. public static void CallAgain(int i) { if (i == 1) { return; } else { CallAgain(i - 1); } } 그리고 재귀함수의 예로써 가장 많이 사용되는 것이 바로 "피보나치 수열"이다. 재귀함수를 가르치기 위해서 다음 같은 방법으로 재귀 함수를 표현하는데.. public static ulong Fibonacci( int N ) { if (N == 0 || N == 1) return (ulong)N; else if (N == 2) return 1; else return Fibonacci(N - 1) + Fibonacci(N - 2); } 이는 크나큰 문제가 있다! 1,..
C#에서 자주 보이는 구문이 하나 있다. 바로 "for". for은 반복을 해주는 반복문으로써 꽤 자주 쓰이게 되는데, 최근에 발견한 for에 관한 이야기이다. 우리가 잘 알고 있듯이 for문은 다음과 같이 사용한다. for (int i = 0; i < Length; i++) { // Do something } 이를 간단하게 나타내면 for (초기문; 조건문; 증감문) { // 내용 } 이렇게 나타낼수 있는데, 대부분의 경우 초기문에는 int i = 0;, 조건문에는 i < Length, 증감문에는 i++를 넣는게 대부분이다. for은 다음과 같은 원리로 작동하는데.. 처음 for문을 만나면 초기문을 실행하고, 매 반복마다 조건문을 검사하여 조건에 맞으면 증감문을 실행하고 조건에..
오늘은 한글조합이 안되는 문제를 가지고 왔다. 윈도우 단축키 중에는 Windows + H : 참 메뉴의 공유를 바로 호출한다. 이러한 단축키가 있는데 이 단축키에 문제가 있다. 바로 이 단축키를 입력하는 순간 다음과 같은 이미지가 나오면서 한글이 조합이 되지 않는다 Alt + F4 장난에 더불어 이도 많은 채팅방이나 커뮤니티에서 사용되고 있는 장난인데 이를 오늘 해결해보고자 한다 해당 문제는 TextInputHost를 종료하는 것으로 간단하게 해결할 수 있다. 일단 Ctrl + Alt + Del > 작업관리자, 또는 Ctrl + Shift + ESC를 통해서 작업관리자를 연다 그 다음 작업관리자에서 세부정보로 간다 세부 정보 중에서 TextInputHost를 찾으면 되는데 아무 프로세스나 ..