Assembly - 데이터 이동, 산술연산 명령어

이쑤신개자두·2023년 6월 17일
0

어셈블리어

목록 보기
1/6

x64 어셈블리 언어

  • 명령어(연산코드) + 피연산자(오퍼랜드)
  • 어셈블리어에서는 메모리에 접근할때 주소를 계산해야한다 !!!

피연산자(오퍼랜드)에 올수있는 3종류

  • 상수 (Immediate Value)
  • 레지스터 (Register)
  • 메모리 (Memory)
    그중에서도 메모리 오퍼랜드는 [~~~]로 둘러싸인 것으로 표현

예시)

오퍼랜드 앞에 크기 지정자가 옴. ABC PTR [~~~]

  • BYTE : 1바이트
  • WORD : 2바이트 (16비트) 워드
  • DWORD : 4바이트 (32비트) 더블 워드
  • QWORD : 8바이트 (64비트) 쿼드 워드
QWORD PTR [0x8048000]
// 데이터 0x8048000을 8바이트만큼 참조

DWORD PTR [0x8048000]
// 데이터 0x8048000을 4바이트만큼 참조

WORD PTR [rax]
// rax가 가르키는 주소에서 데이터를 2바이트만큼 참조

1. 데이터 이동 명령어

어떤 값을 레지스터나 메모리에 옮기도록(대입하도록) 지시

1) mov A, B

B에 들어있는 값을 A에 대입

mov rdi, rsi
// rsi의 값을 rdi값에 대입

mov QWORD PTR[rdi], rsi
// rsi의 값을 rdi가 가리키는 주소에 대입

mov QWORD PTR[rdi+8*rcx], rsi
// rsi의 값을 rdi+8*rcx가 가리키는 주소에 대입

2) lea A, B

  • B의 "유효 주소"를 A에 저장한다.
  • movlea의 차이점은 유효 주소를 저장하냐, 메모리의 값을 직접 저장하냐의 차이
lea rsi, [rbx+8*rcx]
// rbx+8*rcx 를 rsi에 대입

2. 산술 연산 명령어

덧셈,뺄셈,곱셈,나눗셈을 하고 incdec로 값을 1 증가시키거나 1 감소시킨다.

3) add A, B

A에 B의 값을 더한다. 이때, A의 값은 A+B로 바뀐다.

add eax, 3
// eax += 3

add ax, WORD PTR[rdi]
// ax += *(WORD *)rdi

4) sub A, B

A에서 B의 값을 뺀다. 이때 A값은 A-B로 바뀐다.

sub eax, 3
// eax -= 3

sub ax, WORD PTR[rdi]
// ax -= *(WORD *)rdi

5) inc A

A의 값을 1 증가시킴

inc eax
// eax += 1

6) dec A

A의 값을 1 감소시킴

dec eax
// eax -= 1

예제: 덧셈과 뺄셈

Question.

레지스터, 메모리 및 코드가 다음과 같을 때, 아래에서 적절한 값을 채우시오.

[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2

=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A

==================================
[Code]
1: add rax, [rbx+rcx*8]
2: add rcx, 2
3: sub rax, [rbx+rcx*8]
4: inc rax

Solution.

  1. Code를 1까지 실행했을 때, rax에 저장된 값은 0x3133A이다.
  2. rax의 값은 rbx+0x10(0x555555554010) 에 저장된 0x3 만큼 증가합니다.
  3. Code를 3까지 실행했을 때, rax에 저장된 값은 0이다.
  4. rax의 값은 rbx+0x20에 저장된 0x3133A 만큼 감소합니다.
  5. Code를 4까지 실행했을 때, rax에 저장된 값은 1이다.
  6. rax의 값은 1증가합니다.
profile
25.04.28 Restart ~ 1일 1포스트 & 1일 1커밋!

0개의 댓글