Programming 23

어셈블리어 - 함수

단순히 Parameter 및 반환값 없이 Hello World를 출력하는 함수를 만들고 호출하는 예제는 아래와 같다. 함수에서 인자값과 반환값을 사용하기 위해서는 Stack 메모리 영역을 사용한다. Stack 메모리 영역과 관련된 포인터 레지스터는 다음과 같다. IP (Instruction Pointer) : 다음에 수행 할 명령어 주소 SP (Stack Pointer) : 현재 Stack의 top 주소 BP (Base Pointer) : 스택과 관련해 상대 주소를 계산하기 위한 용도 어셈블리어에서 스택에 push/pop 하기 위해서는 다음과 같이 사용한다. push 1 pop rax; 스택에서 pop하여 rax로 가져옴 Stack에 1,2,3을 push하고 pop을 한번하는 과정에서 메모리의 변화는 다..

어셈블리어 - 반복문, 배열

[ 반복문 ] 1부터 100까지의 합 구하기. [ JMP를 사용하는 방법 ] [ loop를 사용하는 방법 ] 사용법 : loop [label] 레지스터 C를 반복문의 Counter로 사용하게 된다. loop를 돌 때마다 C의 값이 하나씩 감소하며 0보다 크면 반복하고 0이되면 중지된다. [ 배열 ] data section에 1byte 원소 10개를 갖는 a배열 선언하기. 초기값은 1-10으로 정의 section .data a db 1,2,3,4,5,6,7,8,9,10 ; char b[10] = {1,2,...,10} data section에 2byte 원소 5개를 갖는 b배열 선언하기. 초기값은 모두 1 .section data b times 5 dw 1 ; short b[5] = {1,1,1,1,1} ..

어셈블리어 - Shift, 논리연산, 분기문

[ Shift 연산 ] [ 논리 연산 ] 자기 자신과 XOR하면 무조건 0이 되는데, 아래 부분은 C에서 return 0의 의미를 갖게 된다. [ 분기문 ] C에서의 if문을 구현하기 위해 CMP 및 JUMP 계열의 명령어를 사용하게 된다. 먼저 if문 안의 조건에 해당하는 비교 연산을 수행하기 위해서는 CMP 명령어를 사용한다. cmp rax, rbx; 여기서 아래 나올 조건 (Jump If Greater 등)의 기준은 rax이다. 비교를 위해서 cmp a, b 했을 경우 a에서 b를 빼게 되며, 그 결과는 Flags Register에 저장된다. 만약, a와 b가 같으면 a - b = 0이므로 ZF(Zero Flag)가 1이 된다. 그리고 이 eFlags Register의 값에 따라서 코드의 분기를 수..

어셈블리어 - add/sub, mul, div

[ SAMS 툴에서 숫자 입력/출력하기 ] - [Help] - [Help]에서 방법을 찾아보면 - 레지스터나 변수에 사용자로부터 부호있는 10진수를 입력받기 위해서 GET_DEC를 사용하면 된다는 것을 알 수 있다. - 부호있는 10진수 데이터 출력은 PRINT_DEC임을 알 수 있다. [ Add/Sub : Carry를 포함하지 않는 덧셈/뺄셈 ] - a는 레지스터 또는 메모리 - b는 레지스터 또는 메모리 또는 상수 - 주의) a,b가 둘다 메모리이면 안된다. Q) 레지스터 A에 1byte를 입력받고, 초기화 되지 않은 전역변수 B에 1byte를 입력받아 A + B를 계산하는 프로그램을 작성하시오. %include "io64.inc" section .text global CMAIN CMAIN: ;wri..

어셈블리어 - 변수 선언/활용하기

[ 프로세스 메모리 구조 ] - 변수를 선언하고 사용하기 위해서는 변수로 사용될 메모리 공간이 필요한데, 용도에 따라(초기화 유무, 지역변수/정적 또는 전역) 어느 영역에 할당하여 사용할지 결정해야 한다. [ 변수 선언하기 ] - 초기화 된 데이터 정적/전역변수를 메모리에 할당하기 위해서는 data 영역에 크기와 함께 지정하여 사용한다. - 초기화 되지 않은 정적/전역변수를 메모리에 할당하기 위해서는 bss 영역에 크기 및 개수와 함께 지정하여 사용한다. %include "io64.inc" section .text global CMAIN CMAIN: mov rbp, rsp; for correct debugging ;write your code here xor rax, rax ret section .dat..

어셈블리어 - 레지스터(Register)

[ Register ] - 레지스터 : 프로세서(CPU)가 사용하는 메모리 - CPU 안에 존재하며 가장 속도가 빠른 저장장치이며 비용이 비싸고 용량이 작다. (레지스터 > 캐시 메모리 > 메인 메모리(주로 DRAM) > 하드디스크/SSD) [ 64-Bits General Purpose Register ] - 범용 레지스터. 연산결과, 상수, 주소 등을 저장한다. - RAX, RBX, RCX, RDX, RSP 등 여러개가 존재하는데 우리는 주로 A,B,C,D를 사용한다. - 어셈블리어에서 해당 레지스터의 몇 byte를 사용할 것인지에 따라 아래와 접두어/접미어를 다르게 붙여서 사용한다. - RAX : 8bytes = 4 word = 1 qword - EAX : 4bytes = 2 word = 1 dwor..

C++ 정리 - (1)

[ Initialization ] #include int main(void) { using namespace std; int nValue = 5; // copy initialization int nValue2(5); // direct initialization int nValue3{5}; // uniform initialization int value{4.5}; // unniform initialization(error) return 0; } - 빈 {}로 uniform initialization을 하면 기본 초기화(default initialization)가 된다. 기본 초기화는 변수를 0으로 초기화한다. - 또한, uniform initialization은 형변환을 허용하지 않는다는 이점이 있다. 변..

C# 6.0 변경점

- C# 6.0에 대응되는 .NET Framework는 4.6 버전이다. 하지만 더 이상 .NET Framework에 종속적이지 않게 바뀌어서 독자적인 컴파일러 업그레이드가 가능하게 바뀌었으므로, C# 6.0 이상의 컴파일러를 .NET Framework 4.6 이하 환경에 설치해 실습하는 것이 가능하다. - 주요한 변경점은 "간편 표기법"을 제공하는 정도이다. [ 1. C# 3.0에 구현된 자동 구현 속성(Auto-implemented Properties)의 초기화 구문 추가 ] - 자동 구현 속성을 사용한 경우 초기값을 부여하려면 별도로 생성자 등의 메서드를 이용해 코드를 추가해야만 했다. 이렇게 구현할 경우, 설정자(set) 메서드를 반드시 구현해야하는 강제성을 수반하므로, 이를 원치 않는 경우에는 ..

Programming/C# 2019.06.29

C# 5.0 변경점 - 호출자 정보, 비동기 호출

- C# 5.0에 대응되는 닷넷 프레임워크는 4.5이고 주요 개발환경은 Visual Studio 2012, 2013이다. 닷넷 4.5는 윈도우 XP, 서버 2003을 지원하지 않는다는 점에 유의하자. 만약 개발한 프로그램이 XP/서버 2003에서 실행되어야 한다면 닷넷 4.0용 응용프로그램을 만들어야 한다. - 닷넷 프레임워크 4.5, 4.6, 4.7의 특징으로, 이것이 닷넷 4.0의 교체판이라는 점이다. 기존의 닷넷 프레임워크는 컴퓨터에 설치하면 "%windir%\Microsoft.NET\Framework" 폴더 아래에 각 버전 번호에 해당하는 폴더가 생성되는 식으로 설치 되었으나, 닷넷 4.5 ~ 4.7은 닷넷 4.0이 설치되어 있다면 덮어써버리고, 4.0이 설치되지 않았다면 새롭게 4.0 폴더에 설..

Programming/C# 2019.04.24