어셈블리 언어는 CPU에 종속되어 있습니다.
일반 PC에서 많이 사용되는 intel CPU와 모바일에 많이 사용되는 ARM CPU는 서로 어셈블리 명령어의 형태가 다릅니다.

어셈코드 작성해보기
_asm(인라인어셈)을 사용하여 상위레벨 언어에서 어셈블리어를 사용가능

  • INC / DEC / ADD / SUB / NEG

INC는 값을 1 증가시킴.

a: 0

a: 2


DEC는 값을 1 감소시킴.

a: 0

a: -2


ADD는 상숫값을 더해준다,(상숫값)

a: 0

a: 15


SUB는 상숫값을 빼준다,(상숫값)

a: 0

a: -15


NEG는 피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.(부호를 바꿔줌)


  • MOV / AND / OR / XOR / NOT

MOV = 연산자

a에 0x10 대입한다.

a: 0

a: 16


AND &연산 해줌


OR |연산 해줌


XOR ^연산 해줌


NOT ~연산 해줌


  • SHR / SHL

15만큼 << 연산함


15만큼 >> 연산함


  • PUSH / POP

퓌쉬 팝 하면 스택이 떠오른다.

push를 한만큼 pop을 해주어야 한다.


push의 경우 상숫값, 레지스터, 메모리 모두 가능하다.

pop의 경우 레지스터와 메모리만 가능하다.

pop은 데이터를 받아줄 공간이 필요함으로 상수에는 받지못함.



push / pop을 이용해 변수 두개의 값을 더하기

스택에 a를 넣는다.

eax 레지스터에 꺼낸다.

add를 이용해 a에 eax레지스터 값을 더한다.


출력

a = 15

b = 16

a = 31


  • PTR

a를 0으로 생성

pa는 메모리 주소를 찾기위해 만듬.

시아웃 출력 0


a에 WORD만큼 크기에 0xffffffff(f8개)를 대입

시아웃 출력 65535

메모리를 보면 int에 4바이트중 2바이트를 ff ff로 채웠다.


a에 DWORD만큼 크기에 0xffffffff(f8개)를 대입

시아웃 출력 -1

메모리를 보면 ff ff ff ff int가 꽉찼다.

ptr을 사용하면 자료형크기 만큼 메모리에 값을 복사한다.

테스트로 char를 사용하면 1바이트 복사해서 int에 1바이트 자리에 값을 넣는다.

ff ff ff ff

char ptr a, 0x0 하면

00 ff ff ff로 가능함.

ptr은 데이터 타입을 재정의 하는 명령어.


  • OFFSET

offset은 전역변수의 주소를 가저온다.

offset을 이용해 주소를 eax에 넣어줌.

[]인다이렉트 모드로 eax에 들어 있는 주소로 이동한다.

offset을 이용해 g_index의 주수를 eax에 넣어놨고 [eax]로 eax에 들어있는 주소를 참조해 g_index에 접근한다.

Direct모드 / Indirect모드 << 링크


  • LEA

lea를 이용해 a의 주소를 eax에 넣고

mov를 이용해 a에 eax를 넣는다.

a에 들어있는 값 2948800을 hex로 표현하면 2CFEC0 a의 주소다.


  • STOS

mov를 이용해 eax에 0xff를 넣어줌.

lea edi에 a의 주소를 넣음

stos는 edi에 주소에 eax의 값을 넣는다.

결과로 255가 출력

stos를 사용할땐 edi에 주소가 있어야하며, eax에 값이 있어야한다.


  • JMP / CMP

JMP는 코드레이블로 표시되는 목적지로 무조건 이동시킨다. 어셈블러는 코드 레이블을 오프셋으로 변환한다. 구문은 다음과 같다.

JMP EXIT

CPU가 무조건 이동을 실행할 때 EXIT의 오프셋은 명령어 포인터로 이동되어 새로운 위치에서 계속해서 실행되게 한다.

루프 생성 JMP 명령어는 루프의 꼭대기에 있는 레이블로 점프하여 루프를 쉽게 만들 수 있게 한다.

goto랑 똑같음.


점프조건문 (if 명령어)

ja, jb, je, jne, jae, jbe, jz, jnz


CMP 사용해보기

스위치문 느낌

브레이크를 해줘야함.

쭉내려감.


  • LOOP

한번 돌때마다 루프 카운터가 감소한다.


mov eax , 0x0  레지스터 eax에 0넣음

mov ecx, 0xf    레지스터 카운터에 15넣음

FOR:              레이블 만듬.

inc eax           eax++시킴

loop FOR       루프가 있으면 지정된 레이블로 점프한다. ecx가 1감소 한다.

inc eax          

반복

ecx 가 0이되면 루프탈출

mov a, eax      eax는 15로 됨. a에 5를 넣어줌.

a출력값 5


반응형