Programming/Assembly 6

어셈블리어 - 함수

단순히 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..