언어/어셈블리언어 5

간단한 배열 및 함수 구현

어셈블리언어에서 배열을 선언하는 방법은 변수를 선언하는 것과 마찬가지로 ; 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 와 for문

if 분기문의 문법 cmp dst, src (dst가 기준) 비교를 한 결과문은 flag register에 저장 a레지스터, b레지스터와 같이 코딩할 때 저장하는 레지스터가 있는것과 같이 상태 및 결과물을 저장하는 특수 목적의 레지스터 위의 jump 시리즈 (jmp label) 이라 불리는 연산자들을 이용하여 분기문을 작성 jmp : 무조건 jump je : jumpEquals 같으면 jump jne jumpNotEquals 다르면 jump 이란 의미들을 포함. jmp 연산자를 이용한 분기문 예시 ; 두 숫자를 비교하여 같으면 1, 다르면 0을 출력 mov rax, 10 mov rbx, 10 cmp rax, rbx ; a레지스터에 b레지스터를 비교 je labelEqual ; 임의의 라벨(변수) mov ..

입출력 및 연산

어셈블리 언어를 다루다 보면 오른쪽에 입출력 창을 볼 수 있다. 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파일)이란 무엇일까? PE파일(portable executable)은 실행파일이라 부르며 흔히 봐왔던 exe파일입니다. 위 사진에서 file이 메모리에 그대로 옮겨짐을 알 수 있는데, 여기서 메모리에 올라가는 데이터는 이것 뿐만 아니라 힙,스택 등 여러가지 정보와 같이 올라가게 됩니다. 어셈블리언어에서 파일에 정보를 할당하기 위해서 필요한 문법은 c와 순서가 다릅니다. 변수이름 크기 초기값 순서로 변수를 선언해주게 되는데 크기는 c의 자료형과 같은 개념으로 db(1byte) dw(2) dd(4) dq(8) 각각 해당크기의 공간만큼 할당받을 수 있습니다. 예를들어 a라는 변수에 1바이트를 할당하겠다 하면 section.dat..

레지스터

컴퓨터는 cpu와 ram, hdd로 크게 나눠볼 수 있는데 그 중 레지스터는 cpu안에서(내장되어) 연산하는 기능을 담당합니다. 하드디스크에서 파일을 불러와서 불러온 파일을 메인메모리에 복사하고 복사한 실행파일을 cpu와 서로 주고받으며 연산을 하는것으로 알고 있었는데.. cpu안에 있는 레지스터라는 것도 연산을 담당하고 있다니. 굳이 필요할까요? 어디에 사용될까요? cpu는 연산을 할 때, 중간중간 연산한 결과들을 어딘가에 잠시 저장해야 하는 경우가 있습니다. 그런데 그 결과들을 잠시 저장만 하면 될텐데 그 기록을 굳이 렘이나 하드디스크까지 가서 저장해야 할까요? 임시로 연산결과를 저장해야 할 필요가 있을 때, 그때 cpu에 내장되어 있는 레지스터라는 작은 용량의 저장소를 이용합니다. cpu에 내장되어..