농소

어셈블리 사칙연산(ADD, SUB, MUL, IMUL, DIV, IDIV), 비트연산, 논리연산 본문

Security/System Hacking

어셈블리 사칙연산(ADD, SUB, MUL, IMUL, DIV, IDIV), 비트연산, 논리연산

농소 2018. 1. 17. 02:07

ADD : 덧셈









어셈블에서는 c와는 다르게 +연산자를 사용하지 않고, add명령어를 통해 덧셈을 한다.

mov를 통해 레이블 num의 메모리값에 10을 넣어주고 레지스터 eax에 20을 넣어준다.

그 후 add명령어를 통해 ( [num] = [num] + eax ) 덧셈을 해준다.

즉, 결과는 10 + 20 = 30이 나오게된다.



SUB : 뺄셈




add와 마찬가지로 매커니즘은 동일하고 +연산이 -연산의 차이밖에 없다.

위 코드는 좀전에 했던 코드의 add 명령어를 sub로 변경한 코드이다

즉 [num] = [num] - eax  => -10의 결과값이 나온다.



MUL : 곱셈 


  - MUL( Unsigned ) 부호가 없는 곱셈 처리

  - IMUL( Signed ) 부호가 있는 곱셈 처리


1). MUL




만약 2바이트를 곱했을때 결과값이 2바이트 크기를 넘어가게 되면

 상위2바이트는 dx에, 하위 2바이트는 ax에 저장이된다.



ex) 10000 * 10000

dx = 1525

ax = 57600

dx = 0000 0101 1111 0101

ax = 1110 0001 0000 0000

즉 0000 0101 1111 0101 1110 0001 0000 0000 = 10000 * 10000 이 된다


2). IMUL 


  - 피연산자가 1부터 3개까지 올수 있고 나머지는 MUL과 동일




DIV : 나눗셈


  - DIV( Unsigned ) 부호가 없는 나눗셈 처리

  - IDIV( Signed ) 부호가 있는 나눗셈 처리



1). DIV




오퍼레이션을 참고하면 크기에따라서 몫과 나머지가 저장되는곳이 다름을 알 수 있다.


 

나머지 

 Word/Byte = 8bit

AL

AH 

 Dword/Word = 16bit

AX

DX 

 Quadword/Dword = 32bit

EAX 

DAX 

 Doublequadword/Quadword = 64bit

RAX

RDX 

< 몫과 나머지 >


위 표중에 Word/Byte 를 한번 표현해 보겠습니다.




2바이트인 256 과 1바이트인 5 를 나눴더니 307이라는 결과값이 나왔다.

 이 10진수를 2진수로 변환 해 보면

0000 0001 0011 0011

AH       |       AL

즉, 몫은 0011 0011 = 51이 나오고

나머지는 0000 0001 = 1이 나오게된다.



2). IDIV




비트 연산 : shift

논리연산 : and, or, xor


앞서 나눗셈에 대하여 작성했던 코드를 볼때 몫과 나머지를 보기위해서 2진수로 변환 한 뒤 결과를 확인했다. 

    하지만 그렇게 보기엔 너무 불편하므로 논리연산을 통한 마스킹기법과 shift를 이용하여 

몫과 나머지를 구해본다.








'Security > System Hacking' 카테고리의 다른 글

nasm 반복문 연습  (0) 2018.01.19
asm 형변환, 관계연산, 제어문  (0) 2018.01.18
레지스터, INTEL 명령어  (0) 2018.01.16
3. ELF파일 구조, nasm 데이터표현  (0) 2018.01.13
2. 컴파일 과정, ELF 실행파일  (0) 2018.01.12