명령어 소개 어셈블리 언어에서 임의 크기의 정수에 대해서 연산을 수행하는 명령어가 있다.지난번 조건부 명령어에 이어서 shift와 rotation 명령어를 알아보자. SHL Instruction왼쪽 시프트SHR Instruction오른쪽 시프트SAL and SAR Instructions왼쪽 오른쪽 산술 시프트ROL Instruction왼쪽 회전ROR Instruction오른쪽 회전RCL and RCR Instructions왼쪽 오른쪽 캐리포함 회전SHLD / SHRD Instructions2배 정밀도 왼쪽 오른쪽 시프트 논리 / 산술 명령어 구분위 명령어 표를 보면 같은 시프트 연산인데 논리 시프트와 산술 시프트가 구분되는 것을 볼 수 있다. 논리 시프트는새로 만들어진 비트 위치를 0으로 채운다..
지금까지 C나 java를 통해 간단하게 조건문을 사용했었다.그렇다면 컴파일러는 조건부 구조를 어떻게 기계어로 변환하는지 알아보자. 블록 구조의 IF 문high level language에서 조건문은 아래와 같이 표현한다.if( op1 == op2 ) X = 1; else X = 2; 이런 간단한 논리적 구조를 어셈블리언어로 변환하면 다음과 같다.mov eax,op1cmp eax,op2jne L1mov X,1jmp L2 L1:mov X,2 L2:사실상 JE 명령어로 == 연산자를 구현한 셈이다. 물론 이 방법만 있는 것은 아니며 여러가지 방법이 있다. 학교 ppt에는 바로 다음으로 넘어가긴 했지만 책에 나온 if 중첩문 예시가 한번쯤 생각해 볼 만 한것같다.if op1 == op2 then if..
고급 언어의 조건부 문장이 저수준으로 구현된 코드로 어떻게 변환되는 지를 알아보자. 논리구조 특성을 구현할 때 어셈블리 언어를 어떻게 사용하는지 살펴볼건데,cpu가 cmp 명령어와 프로세서 상태 플래그를 사용해서 명령어의 피연산자를 비교하므로, 전에 배웠던 상태 플래그를 잠깐 상기해보자. cpu 플래그Zero 플래그는 연산 결과가 0일 때 set 설정 Carry 플래그는 명령어가 대상 피연산자에 비해 너무 크거나 작을 때 set Sign 플래그는 대상 피연산자가 음수이면 set, 대상 피연산자가 양수이면 clear상태로 set 명령어가 유효하지 않은 부호 있는 결과를 생성할 때 오버플로 플래그를 setex) 비트 7 캐리가 비트 6 캐리와 XOR됨 Parity 플래그는 명령어가 대상 피연산자의 하..
스택 스택은 이 그림과 같이 아래부터 차곡차곡 쌓는 후입 선출 구조이다. 그 중 우리는 실행시간 스택에 초점을 맞춰서 알아볼 것이다. 실행시간 스택은 CPU에서 하드웨어가 직접 지원하며 프로시저 호출 및 반환 메커니즘의 필수적인 부분이다. 대부분 실행시간 스택을 단순하게 스택이라고 부른다. Runtime Stack 실행시간 스택은 두 개의 레지스터를 사용해서 CPU로 관리된다. SS (stack segment) ESP (stack pointer) 여기서 ESP 레지스터는 스택에 있는 어떤 위치에 대한 32비트 오프셋을 저장한다. 이 레지스터를 직접적으로 조작하는 일은 없고, CALL, RET, PUSH, POP과 같은 명령어를 사용하여 간접적으로 수정된다. ESP는 항상 스택의 맨 위에 새로 추가된, 즉..
이번엔 어셈블리 언어가 고급 언어와 어떤 근본적인 차이점을 가지는지 소개한다. 우선 데이터 전송 명령어들에 대해 알아보자. 피연산자 타입 이전에 기본적인 명령어 형식은 다음과 같이 소개했다 [label :] mnemonic [operands][ ; comment] 여기에 명령어의 개수에 따라 mnemonic [destination], [source-1], [source-2] 등으로 하나씩 추가했다. 이 상태에서 더 추가적인 유연성을 주기 위해 다음과 같은 피연산자들을 사용한다. (표 참고) 즉시값(immediate) - 숫자 수식을 사용한다. 값은 명령어로 인코딩된다. 레지스터 - CPU에 있는 명명된 레지스터를 사용한다. 레지스터 이름은 숫자로 변환되고 명령어로 인코딩된다. 메모리 - 메모리 위치를 참..
이번엔 어셈블리 언어를 기초부터 차근차근 알아가는 챕터이다. 진짜 완전 기초부터 시작하는 느낌이었다. 우선 정수 상수부터 알아보자. 정수 상수는 선택사항인 부호, 한 자리 이상의 숫자와 선택사항인 접미 문자로 구성된다. [ { + | - } ] digits [radix] 여기서 대괄호 안의 구성요소는 선택사항이며 중괄호 안의 구성요소는 포함된 요소 중 하나를 선택하는 것이다. 요소들은 |문자로 구분된다. 이탤릭체로 된 구성요소는 정의와 설명이 알려진 아이템이다. radix는 진수라고 부르며 16진수는 뒤에 h를, 8진수는 q/o, 10진수는 d, 2진수는 b를 붙인다. [부호화 실수에 r, 10진수에 t, 2진수에 y를 붙이기도 한다.] 이것은 어셈블리 언어의 산술 연산자 우선순위이다. 우리가 알고있던 ..