배열 어셈블리언어에서 배열을 선언하는 방법은 변수를 선언하는 것과 비슷하다. ; data영역에 배열을 선언; 변수이름 크기 초기값section.data a db 0x01, 0x02, 0x03 ; 등등 데이터를 콤마로 이어주면 된다. b times 5 dw 1 ; 배열의 방 5개에 1로 초기화, 크기를 dw2바이트로. 즉, 10바이트를 갖는 배열; bss영역에 배열을 선언section. bss num resb 10 ; 이미 0으로 초기화 되어있는 크기 1(resb), 방 10개짜리 배열 10바이트 c와 마찬가지로 임의의 배열 a를 출력하고자 할 때단순하게 a를 입력하면 배열 a의 주소값이 출력된다. 따라서 값을 출력받고 싶을 땐 [a]로 작성해야 한다. print_hex 1, a ; 배열 a의 주소..
if 문if 분기문의 문법은 다음과 같다.cmp dst, src ;(dst가 기준) 당연히 각각 compare destination, source이다. 비교를 한 결과문은 flag register에 저장된다.a 레지스터, b 레지스터처럼 코딩할 때 저장하는 레지스터가 있는것과 같이상태 및 결과물을 저장하는 특수 목적의 레지스터이다. 위의 jump label 연산자들을 이용하여 분기문을 작성한다. 주로 사용하는 것들 한두개만 먼저 빼보자면 jmp : 무조건 jumpje : jumpEquals 같으면 jumpjne : jumpNotEquals 다르면 jump jmp 연산자를 이용한 분기문 예시; 두 숫자를 비교하여 같으면 1, 다르면 0을 출력 mov rax, 10mov rbx, 10cmp r..
어셈블리 언어를 다루다 보면 오른쪽에 입출력 창을 볼 수 있다.vs의 콘솔창과 비슷한 느낌이다. 다른점이 있다면 입력창도 따로 존재한다는 점. 이 창에 입력을 하고 출력하기 위해선 어셈블리 언어에 내장된 기능이 아닌운영체제 내에서 제공하는 api를 호출하는 기능을 사용해야 한다. GET_DEC 1, al ; get과 10진법의 의미를 갖는 decimal로 레지스터에 1바이트의 크기를 입력 GET_DEC 1, a ; a라는 1 바이트가 할당된(1개를 할당한) 변수에 입력 section.bss a resb 1 이와같이 레지스터와 메모리에 입력을 받아줄 수 있다. 굳이 data가 아닌 bss section을 사용한 이유는어차피 입력을 받아서 변수에 값을 할당할 텐데 굳이 초기화할 필요가 없기 때문이다..
어셈블리언어로 파일을 메모리에 올리는 방법을 알아보기 전에여기서 말하는 파일(PE파일)이란,(portable executable)실행파일이라 부르며 흔히 봐왔던 exe파일을 말한다. 위 사진에서 file이 메모리에 그대로 옮겨짐을 알 수 있는데, 여기서 메모리에 올라가는 데이터는 이것 뿐만 아니라 힙,스택 등 여러가지 정보와 같이 올라가게 된다. 어셈블리언어에서 파일에 정보를 할당하기 위해서 필요한 문법은 c와 순서가 다르다.변수이름, 크기, 초기값 순서로 변수를 선언해준다. 크기는 c의 자료형과 같은 개념으로 db(1byte) dw(2) dd(4) dq(8) 각각 해당크기의 공간만큼 할당받을 수 있다. 예를들어 a라는 변수에 1바이트를 할당하겠다 하면 다음과 같이 선언한다.section.d..
컴퓨터는 cpu와 ram, hdd로 크게 나눠볼 수 있는데 그 중 레지스터는 cpu안에서(내장되어) 연산하는 기능을 담당한다. 어셈블리를 배우기 전 컴퓨터의 연산은하드디스크에서 파일을 불러와서 불러온 파일을 메인메모리에 복사하고,복사한 실행파일을 cpu와 서로 주고받으며 연산을 하는것으로 알고 있었는데..cpu안에 있는 레지스터라는 것도 연산을 담당하고 있었다.그런데 굳이 필요할까? cpu는 연산을 할 때, 중간중간 연산한 결과들을 어딘가에 잠시 저장해야 하는 경우가 있다.그런데 그 결과들을 잠시 저장만 하면 될텐데 그 기록을 굳이 렘이나 하드디스크까지 가서 저장하기는 번거롭다. 임시로 연산결과를 저장해야 할 필요가 있을 때, 그때 cpu에 내장되어 있는 레지스터라는 작은 용량의 저장소를 이용한..
스택 프레임은 활성화 기록(activation record)이라고도 불리며, 프로시저의 반환 주소, 전달된 매개변수, 저장된 레지스터, 지역 변수 등을 위한 스택의 일부이다. 스택 프레임은 다음과 같은 단계로 생성된다.호출 프로그램이 인수를 스택에 푸시하고 프로시저를 호출한다.호출된 프로시저는 EBP를 스택에 푸시하고, EBP를 ESP로 설정한다.지역 변수가 필요하면, 상수를 ESP에서 빼서 스택에 공간을 만든다. 스택 프레임의 구성요소와 재귀를 통해서 서브루틴(함수)과 서브루틴 호출 기반 구조가 어떻게 이루어지는지 알아보자. 스택 매개변수 Stack Parameters 지금까지는 프로시저가 레지스터 매개변수를 사용해왔다. 하지만 레지스터 매개변수를 사용하면 코드가 복잡해졌다. 스택 매개변수는 레지스터 ..