본문 바로가기
Reversing/Assemble

[ Assemble ] 어셈블리어 덧셈(add)/뺄셈(sub) 실습

by 코뮤(commu) 2020. 4. 15.
728x90
반응형

 

 

SASM 환경에서 진행합니다.

 

 

Assemble 더하기 연산

 

우선 레지스터끼리의 더하기 연산 실습을 해봅시다!

 

 

 

 

 

그림은 eax 에는 1을, ebx에는 6을 복사한 뒤

add를 이용해서 eax와 ebx를 더한 값을 eax에 넣는 코드입니다.

 

 

add 파라미터1, 파라미터2

 

 

의 형식으로 덧셈을 진행합니다. 이는 c언어등의 다른 언어에서

파라미터1 = 파라미터1 + 파라미터2

와 동일한 기능을 합니다.

 

 

결과 값을 예측해보세요.

어떻게 될 것 같나요?

 

 

 

 

 

 

네. 7이 나옵니다.

 

이제 변수를 선언해서 덧셈 연산을 해봅시다.

 

 

 

 

 

자. 여기서 문제 하나 드리겠습니다.

위 그림의 코드는 정상적으로 실행이 가능할까요?

에러가 난다면, 어떤 라인을 어떻게 바꿔야 할까요?

 

 

 

 

덧셈과 뺄셈 등의 연산에서,

같은 메모리 변수는 더하거나 뺄 수 없습니다.

 

 

 

 

 

add [a], [b] 는 올바르지 못한 문법이라는 것입니다.

그럼 어떻게 해야할까요? 저는 a와 b를 더하고 싶은데요?

 

 

 

 

 

우리에게는 레지스터 가 있습니다!

레지스터는 연산 결과를 저장할 수 있기 때문에

a 변수와 b 변수를 이어줄 수 있는 매개체가 되어 줄 것입니다.

코드를 수정해보도록 하겠습니다.

 

 

 

 

a 메모리 변수 안에 있는 값을 eax에 복사하고, eax 와 b 메모리변수의 값을 더합니다.

그리고 eax 를 출력했습니다.

 

실행시켜볼까요?

 

 

 

 

정상적으로 출력되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

Assemble 빼기 연산

 

 

위의 덧셈 연산에서는 add 파라미터1, 파라미터2 를 이용했습니다.

뺄셈은 add가 아닌 sub 을 이용합니다.

 

 

 

 

위 그림의 출력 결과를 예측해보세요.

 

 

정답은?

 

 

아, 물론 값과의 뺄셈(덧셈도 마찬가지)도 가능합니다.

 

 

 

메모리 변수 값에 바이트 크기의 1을 빼준 값을 다시 a 에 저장해주는 코드입니다.

 

출력하면 당연하게도 5가 나옵니다.

 

 

 

 

 

 

Assemble 덧셈/뺄셈 정리

< 덧셈 >

 

add 파라미터1, 파라미터 2

 

- 파라미터1 : 레지스터 or 메모리에 있는 값

  ex: eax, [a] (O) a(X)

- 파라미터2 : 레지스터, 메모리, 값

  ex: eax, a, [a], byte 2 (O)

 

※ 파라미터1 과 파라미터2 가 전부 메모리 값일 경우 에러발생.

 

 

< 뺄셈 >

 

sub 파라미터1, 파라미터 2

 

- 파라미터1 : 레지스터 or 메모리에 있는 값

  ex: eax, [a] (O) a(X)

- 파라미터2 : 레지스터, 메모리, 값

  ex: eax, a, [a], byte 2 (O)

 

※ 파라미터1 과 파라미터2 가 전부 메모리 값일 경우 에러발생.

728x90
반응형