JA과 JB는 부없는 수를 비교하는 비교 연산자고JG와 JL은 부호 있는 수를 비교하는 비교 연산자이다. SF = 최상위 비트가 부호라고 가정했을 때 최상위 비트가 1일때 SF는 1이된다.OF = 부호있는 비트에 연산 후 값이 침범되었을 때 OF는 SF가 1이 된다.(양수, 양수일때 음수가 되버리거나음수, 음수일때 양수가 되버리면 OF가 설정됨) 앞에가 크고 양쪽 모두 양수이면 SF, OF는 안나옴 1. Jump GreaterZF = 0 && SF = OF2.Jump LessSF OF = 같지 않다!
N = NOT이라는 뜻 1. JNE Jump if NOT EqualZF 가 0일때 점프를 한다. 2. JNZ Jump NOT ZeroZF 가 0일때 점프를 한다. 크고작음을 나타내는 비교 3. JA(Jump Above)클때 점프, CF가 0, ZF가 0일때 점프를한다.앞의 인자의 값이 크면 점프하라 4. JB(Jump Below)작을 때 점프, CF가 1일때앞의 인자의 값이 작으면 점프하라 상태 레지스터CF(Carry Flag) - bit자리수가 넘어가는 연산이 있으면 CF가 1 로 셋팅된다.올림을 영어로 Carry 라고 한다. 1111+ 0001 = 1 0000bit를 넘어서서 값이 나왔기 때문에 CF가 1으로 셋팅된다. 0001-0010 = 1111빌림이 발생해서 CF가 1로 셋팅된다
조건문은 동일하게 J로 시작 JMP [주소] - 무 조건 점프 조건 점프JZ [주소] - JUMP ZERO, 이전의 명령어의 연산값이 0이라면 점프해라, ZF FLAG가 1일 때 실행됨. 상태 레지스터에 따른 명령어의 분기가 됨. JE [주소] - JUMP IF EQUAL, 이전의 명령에서 비교한 조건이 같으면(ZF= 1 이면) 점프해라 결과적으로는 JZ = JE 이다. CMP [인자1],[인자2] - MOV의 인자와 같게 들어올 수 있다.Compare, 비교하다의 약자이다.CMP는 내부적으로 빼기를 하여 비교한다.CMP 2,2 이라고 한다면 2 - 2 를 한 후 이 결과값이 0이 나오기 때문에Zero Flag가 참이 된다. 정리JZ = JE, 이전의 연산 값이 0, 즉 같으면 점프해라, zero fla..
대괄호 [ ] 안에 들어가있는 모든 값들은 주소를 나타낸다.예)[402000] -> 402000이라는 주소를 나타냄[EAX] -> 만약 EAX 안에있는 값이 402004라고 하면그 402004는 주소를 나타냄 1. OFFSET을 이용한 주소 접근 OFFSET이란, 기준 주소에서 얼마큼 떨어진 주소를 가르킬때 쓰는 말이다. 만약 C언어에서 int C[5]라는 배열이 존재한다고 생각해보자.기준점은 C[0]번째일것이고, 만약에 C[2]번째를 가르킨다고 할 때C[0] + int형 두개의 크기, 즉 8byte가 되면 C[2]를 가르키게 될것이다. 1) 기준주소를 레지스터에 넣고 OFFSET을 숫자로 이번에는 char B[5]={0,1,2,3,4}라고 하고 B[0]의 주소가 402000이라고 가정했을 때 그렇다면 ..
MOV dword ptr [402000], 0 주소값에 직접 접근하는것이아니라주소값을 레지스터에 넣은 후 레지스터로 접근한다. MOV eax, 402000MOV dword ptr[eax], 0 메모리에 다른 메모리의 주소를 넣는것이 포인터의 개념이다. int a = 0;int *p = &a;*p = 4; 임의로 a의 주소는 402000, *p의 주소는 402004라고 하자.int a = 0을 어셈블리어로 표현하자면mov dword ptr[402000], 0 int *p = &a를 어셈블리어로 표현하자면mov dword ptr[402004], 402000 *p = 4를 어셈블리어로 표현하면mov ebx, dword ptr[402004]mov dword ptr[ebx], 4 p 라는 변수에 a의 주소를 저장..
ADD와 SUB는 MOV 명령어와 동일한 형식으로 쓰인다. ADD와 SUB 명령어는 C언어의 다음과 같다. 만약 ADD EAX, 10 이라고 한다면C 언어에서 EAX += 10 과 같다. 1. ADD (Addition) [저장공간], 값 2. SUB (Subtraction) [저장공간], 값 * [메모리], 레지스터 [메모리], 값 [레지스터], 레지스터 [레지스터], 메모리 [레지스터], 값
1. INC(increment)증가, C언어의 ++[인자] 효과를 가진다.2. DEC(decrement)감소, C언어의 --[인자] 효과를 가진다. 3. INC, DEC 공통점INC와 DEC의 인자는 한개이다.인자에는 메모리와 레지스터를 가리킬 수 있다.
JMP(JUMP)EIP란? 현재 실행할 코드의 주소가 적혀있는 곳, 실행할 코드를 CPU에 올리고, 실행코드의 크기만큼 EIP를 증가시킨다. EIP가 JMP의 크기만큼 증가되고 코드가 실행되게 되면점프할 곳의 주소와 EIP주소의 차를 이용해서 EIP에 더해주는 방식을 사용한다. JMP할 곳이 가깝다(한 바이트 이내, -127 ~ 127)면 JMP 명령어에 SHORT가 붙는다. EIP는 범용 레지스터가 아닌 특수 레지스터로 MOV같은 일반적 기계어로 작동이 안되고 JMP로 작동해주어야한다. jmp 후 다른 저장공간의 값이 올 수도있다.jmp eaxjmp ebx 등등.. 범용 레지스터를 사용할 수도있다. 참고 )DB 00 이란 Data Byte 가 00이라는 뜻이다. 00이란 값을 채워둘 때 사용한다.
메모리에 저장하는 방식에는 두가지가 존재한다. 1. 리틀 엔디안(Little Endian)역순 저장 장점 : 짝 홀수의 구분이 쉽다.(첫 바이트만 보고 짝홀수를 판단하면 됨)포인터 값 참조시 유리하다.예를 들어, char *x라는 포인터 변수가 하나 있고, 이 x가 가리키는 메모리 주소의 값이 0x12345678라고 가정해 봅시다.이 때, y = *x와 같이 포인터 변수가 가리키는 값을 참조하고자 할 경우, 포인터의 시작 주소에서 1바이트(char형)만 가져오면 자연스럽게 가장 낮은 바이트인 0x78가 참조되게 됩니다. 왜냐면 Little Endian의 특성에 따라 메모리에 저장된 데이터 값은 0x78 0x56 0x34 0x12가 되기 때문입니다. 2. 빅 엔디안(Big Endian)순차적 저장 장점 :..
RAM (Random Access Memory)주 기억 장치, 컴퓨터가 켜져있을 동안 정보를 저장하는 저장공간하드보단 훨씬 빠르며 CPU 레지스터보단 느린 저장공간이다. RAM에서는 메모리주소를 사용하는데 메모리 주소를 사용하는 이유는그 메모리 주소를 찾아가면 원하는 데이터가 존재하기 때문이다. 250번지 - 1100번지 - 310번지 - 909번지 - 2 이렇게 데이터가 존재한다면 번지, 즉 메모리주소를 불러오면 해당 값을 얻을 수 있다. 그리고 어셈블리어에서 메모리 주소의 사용법은 '[]' 기호를 사용한다.mov [200], 20이렇게 표현한다면 200번지에 20을 넣어라라는 명령이되겠다. 그런데 이 명령어를 실제로 살펴보면 "mov byte ptr[200], 20" 이렇게 표현해야 옳다.그럼 byt..