목록SISS (2017-2018)/어셈블리어 (16)
알맹이방
이 jmp 앞의 short의 의미는 f9과 같이 한 바이트로 이동범위를 저장할 수 있으면 short가 붙는다 ( -128 ~ 127) long은 아무것도 붙지 않는다. jmp 뒤에는 레지스터도 쓸 수 있다. 레지스터 eax안에 401005라는 값이 있다면 401005라는 주소값으로 jmp하는 것이다. jmp뒤에 ram 메모리주소도 쓸 수 있다. 402000이라는 ram메모리 안에 401002라는 주소값을 저장하고 [402000]으로 jmp하면 401002라는 주소값으로 jmp한다.
JMP = 실행의 흐름을 뛴다라는 의미 EIP라는 레지스터는 다음에 실행할 명령어의 주소를 저장하는데 평소에는 주소가 차례로 증가하지만 JMP 명령어를 이용해서 중간에 EIP에 저장된 주소를 변경하면 바로 그 주소로 넘어갈 수 있다. EIP도 레지스터이긴 하지만 범용레지스터가 아니기 때문에 MOV명령어로 그 값을 변경해 줄 수 없고 JMP로 가능하다. JMP 명령어를 넣으면 JMP SHORT [주소값] 이렇게 명령어가 된다. short는 실행할 명령어랑 현재 명령어가 가까울 때를 의미한다. 위처럼 40100F에서 옆에 EB F4가 있는 걸 볼 수 있는데, eb가 jmp short를 의미하고 f4가 움직일 만큼이다. 40100F가 끝나면 401011이 eip에 저장되는데 여기서 f4만큼 움직이라는 뜻이다...
일단 메모리를 읽는 순서는 주소값이 낮은 것부터 높은 순서대로 읽는 것을 알아야 한다. 메모리를 저장하는 방법에는 리틀엔디언과 빅엔디언이 있다. 둘을 모두 지원하는 것은 미들엔디언이다. 이들은 모두 하드웨어의 구조, 설계의 다름에 차이가 있다. 어떤 값을 저장공간에 저장하라 할 때, 낮은 자릿수부터 저장하면 리틀엔디언, 높은 자릿수부터 저장하면 빅엔디언이다. 따라서 빅엔디언은 앞에서부터 높은자리수라고 이해하며 차례대로 읽으면 되지만 리틀엔디언은 먼저 읽은 것은 낮은 자리수로 이해하면 된다. 3456은 일단 이진수로 00110100 01010110 이다. 3456을 저장할 때 리틀엔디언이면 01101010 00101100 좌우대칭의 56. 좌우대칭의 34 으로 메모리에 들어가게 된다. 또한 3456을 빅엔..
전 시간에서 봤던 byte ptr에 대해서 알아보겠다. byte뿐만 아니라 dword, word도 존재한다. 그렇다면 이것들이 의미하는 바는 무엇일까? 그 전에 공통적으로 들어가는 PTR이 의미하는 바는 무엇일까? ptr은 c언어에서도 배웠듯, 포인터의 줄인 말이다. 어셈블리어에서의 포인터는 메모리의 공간을 가리키는 말이다. DWORD = 4byte (d=double) WORD = 2byte BYTE = 1byte 32비트 구조다라고 했을 때 word(기본)=4byte여야 자연스러운 것 같은데 사실은 2byte인 이유는 원래 16비트였었는데 32비트로 확장이 된 것이기 때문에 word의 의미를 4byte로 바꾸면 헷갈릴까봐 원래의 의미인 2byte로 계속 쓰도록 했기 때문이다. 32비트에서는 확장된 개념..