42Seoul/Libasm

[Libasm] 어셈블리 변수, 명령어 및 프로그램 구조

  • -
728x90

어셈블리 변수

data type size
BYTE 부호 없는 1byte
WORD 부호 없는 2byte
DWORD 부호 없는 4byte
QWORD 부호 없는 8byte

 

어셈블리 산술 연산

명령어 수행내용 참고
MOV a, b a = b (b를 a에 대입(복사)  
ADD a, b a += b  
SUB a, b a -= b  
INC a a += 1 기계코드 크기가 ADD, SUB 보다 더 작다
DEC a a -= 1 기계코드 크기가 ADD, SUB 보다 더 작다
movzx a, b a가 b보다 큰 공간이어도 복사가 되고, 남는 공간은 0으로 채워짐 부호가 없는 정수에만 사용
movsx a, b 남는 공간이 1로 채워짐. 부호가 있는 정수에만 사용

 

어셈블리 조건

지시 정의 플래그
JMP 무조건 분기 명령을 실행  
J<조건> 조건에 따라 수행(set = 1, unset = 0)  
JE / JZ Jump Equal or Jump Zero ZF
JNE / JNZ Jump Not Equal or Jum Not Zero ZF
JG / NLE Jump Greater or Jump Not Less/Equal OF, SF, ZF
JGE / JNL Jumb Greater / Equel or Jump Not Less OF, SF
JL / NGE Jump Less or Jump Not Greater/Equal OF, SF
JLE/JNG Jump Less/Equal or Jump Not Greater OF, SF, ZF

 

특별한 용도 - fla 조건

지시 정의 플래그
JXCZ Jump if CX is Zero none
JC Jump If Carry CF
JNC Jump If No Carry CF
JO Jump If Overflow OF
JNO Jump If No Overflow OF
JP / JPE Jumb Parity or Jump Parity Even PF
JNP / JPO Jump NO Parity or Jump Parity Odd PF
JS Jump Sign (negative value) SF
JNS Jump No Sign (positive value) SF

 

비교 명령 CMP

 명령어 수행 내용 참고
CMP a, b a - b에 따라 플래그들이 세팅된다  

 

CALL, RET

 명령어 수행 내용
call 서브프로그램으로 무조건 분기를 한 후, 그 다음에 실행될 명령의 주소를 스택에 푸시
ret 그 주소를 팝한 후 그 주소로 점프
   

 

어셈블리 기본 구문

data section

section.data

초기화된 데이터, 상수 선언을 위한 공간

런타임에 변하지 않는 데이터들

상수, 파일 이름, 버퍼 사이즈 등을 선언

 

 

BBS section

section.bbs

Block Starting Symbol

변수 선언을 위한 공간

 

Text section

section.text
	global	_start
_start:

실제 코드 저장을 위한 공간

 

문법

x64 intel 문법

Opcode Operand1, Operand2 ;주석
  • opcode(명령어), operand(인자값)
    • operand1 : src, operand2: dst
    • 특정 레지스터의 메모리 주소를 참조할 때는 대괄호를 사용
    • Offset: EAX 레지스터에서 +4 만큼 떨어진 메모리 주소를 표기할 때는 [EAX + 4]와 같이 표현
    • 세미콜론으로 주석 처리

x64 레지스터의 종류

레지스터는 CPU가 요청을 처리하는데 필요한 데이터(명령어, 연산결과, 복귀주소 등)을 일시적으로 저장하는 기억장치이다.

 

범용 레지스터

  • RAX(Accumulator) : 더하기, 빼기 등 산술/논리 연산을 수행하며 함수의 return 값이 저장
    • 시스템 콜 함수를 사용하려면 RAX에 함수의 syscall 번호를 넣어준다.
  • RBX(Base) : 메모리 주소를 저장하기 위한 용도로 사용
  • RCX(Count) : 반복문에서 카운터로 사용되는 레지스터. 인덱스와 같은 역할을 하지만 ECX는 미리 반복 값을 정해두고 명령어를 사용할 때 마다 값이 하나씩 줄어든다는 점이 다르다.
    • syscall을 호출했던 사용자 프로그램의 return 주소를 가진다.
  • RDX(Data) : 다른 레지스터를 서포트하는 여분의 레지스터. 큰 수의 곱셈이나 나눗셈 연산에서 EAX와 함께 사용된다.

인덱스 레지스터

  • RSI(Source Index) : 데이터를 복사할 때 src데이터, 즉 복사할 데이터의 주소가 저장된다.
  • RDI(Destination Index) : 데이터를 복사할 때 복사된 dest 데이터의 주소가 저장된다.

플래그 레지스터

  • RFLAGS register : 시스템 제어 용도 혹은 어셈블리에서는 비교/조건문 처리 용도로 사용되는 상태 레지스터이다. 연산 결과에 따라 64비트 레지스터의 각 비트에 0(clear, reset) 혹은 1(set)으로 표시해 처리 결과를 저장한다.
    • CF (Carry Flag) : 부호 없는 수 끼리 연산 결과가 자리올림/자리내림이 발생할 때 1, unsigned int 값을 벗어날 때 1
    • OF (Overflow Flag) : 부호 있는 수 끼리 연산 결과가 Overflow인 경우 1
    • SF (Sign Flag) : 연산 결과 최상위 비트가 1인 경우 1
    • ZF (Zero Flag) : 연산 결과가 0이면 1
    • AF (Auximiliary-carry Flag) : 16비트 연산시 자리올림/자리내림이 발생할 때 1
    • PF (Parity Flag) : 연산 결과가 짝수면 1, 홀수면 0
    • DF (Direction Flag)
    • IF (Interrupt Flag)
    • TF (Trap Flag)

이 외에도, 64비트에서는 R8 ~ R15까지 8개의 레지스터가 추가로 사용되며, 하나의 레지스터는 아래 그림처럼 크기에 따라 적절히 쪼개 사용할 수 있다.  

RAX(64 bits) EAX(32 Bits, Extended AX) AX(16bits) AL(8bits) AH(8bits)

https://velog.io/@hidaehyunlee/libasm-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B5%AC%EC%A1%B0%EC%99%80-x64-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

Syscall table

hongci.tistory.com/23?category=219348

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.