prefix byte 란?

어셈블리(MASM) 2008. 11. 26. 16:28

prefix byte 란?

mov  ax , 0

mov   eax , 0

은 둘다 같은 opcode(기계어 코드)인 B8을 가리키지만 ax 레지스터는 16비트, eax레지스터는 32비트 레지스터이다 따라서 뒤에 오는 어퍼렌드는 크기가 달라서   mov ax,0은 B8 00 00  처럼 기계어로 대치되며 mov eax,0은 B8 00 00 00 00 처럼 기계어로 대치된다. 이와 같이 오퍼렌드의 크기는다른데 opcode가 같다면 이것을 구분하기 위해 prefix byte를 사용하게 되는데 66 B8 00 00 처럼 16비트 오퍼렌드를 가지는 opcode 앞에 0x66 을 붙여 뒤에오는 오퍼렌드가 16비트 임을 알린다

사용자 삽입 이미지



그림에서 보는것과 같이 mov ax,0 과 mov eax,0을 코드로 작성하고  디버깅을 한후 값을 확인 해보면

메모리에 prefix byte 인 0x66이 들어 있는 것을 확인 할수 있다.




Posted by 응이

레지스터란

CPU 내부에 있는 8,16,32Bit 고속 저장소를 말하며 일반적으로 사용하고 있는 메모리 보다 데이터를 훨씬 빨리 읽거나 쓰도록 되어 있습니다.

종류로는

세그먼트레지스터

CS(Code Segment):프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작위치를 보관합니다.

DS(Data Segment):데이터가 재장되는 메모리 영역의 시작위치를 보관합니다.

SS(Stack Segment):스택으로 사용되는 메모리 영역의 시작위치를 보관합니다.

ES(Extra Segment):변수들을 위한 추가 메모리 영역의 시작위치를 보관합니다.

인덱스 레지스터:데이터와 명령어들의 오프셋 주소를 갖는다.

BP(Base Pointer):SS 레지스터로부터의 오프셋 주소를 갖는다.

SP(Stack Pointer):스택 최상부 위치의 오프셋 주소를 갖는다.

SI(Source Index):소스 문자열이 사용되며 SI레지스터가 이 문자영을 가리킨다.

DI(Destination Index):DI 레지스터는 문자열 이동 명령어에서 데스티네이션을 가리키느데 사용된다.

상태 및 제어 레지스터

IP(Instroduction Pointer):항상 현재 코드 세그먼트내의 다음 실행될 명령어의 오프셋 주소를 갖는다. IP와 CS 레지스터는 결합하여 다음 실행될 명령어의 메모리 주소를 결정한다.

Flag:플레그 레지스터의 비트들은 CPU의 현재 상태 또는 연산 결과와 관련된 정보를 보여 준다. 관련된 비트 위치는 각각 이름이 주어지고, 관련되지 않는 위치들은 정의 되지 않는다.

제어 플래그

방향 플레그(DF):MOVS,CMPS,SCAS같은 명령어들의 블록데이터 이동에 영향을 준자.

 0:데이터 이동 주소 증가, 1:감소

인터럽트 플레그(IF) :시스템 인터럽트들이 처리되거나 되지 않도록 명령한다.

트랩 플레그(TF):명령어 하나 하나 실행된 후 CPU가 정지 상태로 되어야 할지 말지를 결정한다.

상태 플래그:상태 플레그들은 CPU가 실행한 산술 및 논리 연산의 결과를 반영한다.

캐리 플레그 (CF):부호 없는 산술 연산 결과가 너무 커서 데스티네이션 피연산자에 저장되지 못할 때 설정된다.

오버 플로우 플레그(OF): 부호 있는 산술연산 결과가 너무 많은 비트들을 요구하여 데스티네이션 피연자에 저장하지 못할 때 사용된다.

부호플래그(SF):산술 및 논리 연산의 결과가 음의 수가 될 때 설정된다.

보조플래그(ZF):산술 및 논리 연산 결과가 0 일 때 설정된다.

제어플래그(AF):피연산자의 비트 3에서 비트4로 자리올림이 발생했거나, 비트 4에서 비트 3으로 자리내림일 때 설정된다.

패리티플래그(PF):연산 결과에서 값이 1인 비트이 수를 나타낸다


Posted by 응이

- 함수의 정의

함수가 정의된 파일이 아닌 외부 파일에서 함수사용을 가능 하게 하기위해 함수를 PUBLIC으로
선언해 주어야 한다.

PUBLIC TEST

PUBLIC TEST,TEST2,TEST3 처럼 여러개의 함수를 ( , ) 를 사용해서 같이 적을 수 있다.



== 어셈블리 == 

TEST PROC NEAR32

push ebp           

mov ebp,esp

 함수 내용부


mov esp,ebp

pop ebp

ret

TEST ENDP
 



== C 언어 ==

void TEST(void)

{

 함수 내용부

}


 

위에서 어셈블리 함수 에서 볼수 있는

push ebp           

mov ebp,esp

는 함수의 Entry Code라 하고 함수 시작부 주소의 설정과 호출되기전 함수의 시작부 등을 설정해 주는 기능을 한다. 함수내에서 반드시 있어야 할 코드이다.

Entry Code와 함께 있어야할것이 바로 Exit Code라 불리는 아래 코드다.

mov esp,ebp

pop ebp

ret

Entry Code와 함께 반드시 있어야 하며 Entry Code에서 변경 되었던 EBP(Entry Base Point)를
다시 호출되기전 값으로 복구시키고 리턴어드레스로 돌아가게 하는 역할을 한다.

 - 함수의 선언

어셈블리 역시 C언어나 기타 언어처럼 함수의 선언이 가능하다.

어셈블리       :      EXTERN TEST:NEAR32

C 언어         :      void TEST (void)



 

- 함수 호출시의 STACK 구조

인자 없이 사용되는 함수의 호출시 메모리 STACK 구조는 다음과 같다.

                 

                   -  호출전 -

사용자 삽입 이미지

     

           -  호출 직후  -

사용자 삽입 이미지


                 -   호출시 함수 내부   -

사용자 삽입 이미지


인자가 있는 함수를 사용할 경우의 STACK 구조는 다음과 같다.

사용자 삽입 이미지


   - 함수 내부에서의 인자 접근 방식

 

사용자 삽입 이미지

Posted by 응이

Dream come true.
응이

달력

태그목록