GaGe

어셈블리어 3. 범용 레지스터 본문

SISS (2017-2018)/어셈블리어

어셈블리어 3. 범용 레지스터

Sorrel 2018. 7. 8. 01:49

레지스터와 레지스트리는 비슷한 단어이지만 다른 저장공간이므로 각별히 주의하자.

레지스트리 : 윈도우에서 시스템의 다양한 설정값들을 저장하기 위한 저장 공간
레지스터 : CPU 내에 있는 가장 빠른 저장 공간

앞에 글에서 했던 것처럼 전체를 다시 시작할 수도 있지만 특정 부분에서 다시 시작할 수도 있는데 그 때는 그 특정 부분을 클릭하고 좌클릭해서 new origin here (ctrl+*)을 누르면 된다.

앞에 글에서는 eax라는 레지스터 공간에 값을 저장한다라고 설명했지만 정확히 말하자면  덮어쓰기의 개념으로 설명된다. 이 점은 C언어에서의 변수의 기초 개념으로 많이 다루었기 때문에 자세한 건 생략한다.

명령어를
mov eax,0
mov ecx, 1
mov ebx, 2
mov edx, 3
으로 하고 실행시키면 오른쪽 레지스터의 값이 변경된 것이 보인다.

 위의 실행과 비교하여 eax가 0, 1, 3, 4로 덮어씌워지는 것을 볼 수 있었다.

mov 명령은

"mov reg, 직시값"의 형태의 명령도 가능하지만 "mov reg,reg"의 명령 형태도 가능하다.
레지스터에 다른 레지스터 값을 덮어씌우는 것이다.

ebx에 eax의 값이 덮어씌워진 것을 볼 수 있다.

레지스터 값을 바꾸는 데에는 mov의 명령어도 있지만, 레지스터 공간을 직접 더블클릭해서 값을 바꾸는 방법도 있다. signed는 부호가 있는, unsigned는 부호가 없는 값을 넣는다.

signed에 10을 넣었더니 hexadecimal에 자동으로 A가 들어간다.

또한 A를 명령어 mov로 넣을 때 0A로 넣는데 이는 16진수에서 A를 표현할 때 이 문자가 숫자임을 정확히 하기 위해서 0을 붙여주는 것이라고 한다.

 
또한 레지스터에는 EAX, AX, AH, AL의 부분이 있는데 이를 자세히 설명해보겠다.

인텔 CPU가 16비트에서 32비트로 넘어갈 때의 흔적이라고 한다.
원래 16비트일 때는 AX만 존재했는데 32비트로 확장되면서 EAX로 늘어난 것이다.

AX = 00000000/00000000 (16비트)
            AH         /       AL
EAX = 00000000/00000000/00000000/00000000 (32비트)
                                                      AX
                                           AH.                AL


현재는 64비트 RAX지만 여기에서는 쓰이지 않으니 설명은 생략한다.

1234567이라는 숫자를 넣으면 16진수로 12D687이고
저절로 AX 부분에 00/12/D6/87D687, AH에는 D6, AL에는 87이 들어가게 된다.

mov 명령어로 바로
mov EAX, 12D687을 넣어도 결과는 같다.

이 특성들은 EAX, EBX, ECX, EDX에만 해당되는 것으로, ESP와 EBP는 조금 다르다고 한다.
나중에 나올 때 설명하겠다.

EAX등으로 말고 바로 AL등의 작은 범위에도 바로 값을 넣을 수가 있다.

예를 들어 위 사진에서 보이는
MOV CH,0A

넣어주면 원래 0000000A였던 ECX가 00000A0A로 CH 부분에 0A 값이 들어간 것을 볼 수 있다.

레지스터에 값을 넣을 때 값을 복사하는 부분과 값을 받는 부분의 크기가 같아야 한다.

위 사진처럼 mov ch, eax를 하면 size error가 난다.
ch는 1바이트고 eax는 4바이트이기 때문이다.

따라서 AH는 1바이트인데 2바이트인 1234를 넣게 되어도 range 범위 오류가 난다.             

Comments