관리 메뉴

IT창고

System 어셈블리어 사칙연산 본문

보안/System

System 어셈블리어 사칙연산

방구석여포 2018. 1. 17. 01:30

연산자에는 사칙연산(+,-,*,/), 비교연산자(>,<), 논리연산자(and, or, not, xor), 비교연산자(shift) 가 있습니다.


이번에는 어셈블리어의 사칙연산 대해 알아보겠습니다.


어셈블리어에서 +,-,*,/같은 기호는 [ 주소 + ] 로 주소표현 내에서만 기호를 사용합니다. 그럼 기호를 못쓰는데 어떻게 사칙연산을 할것인지에 대해 알아보겠습니다.



1. 덧셈(+)

어셈블리어에서는 사칙연산을 명령어로 하게 됩니다. 덧셈의 명령어는 add 입니다. 

Tip 한번에 두개의 메모리는 참조할수없습니다. 하나만 가능합니다.



어셈블리어에서 주소연산을 하기 위해서는 반드시 []를 사용해주어야만 합니다.


결과는 덧셈으로 30의 결과를 확인할수있습니다.


2. 뺄셈(-)

뺄셈의 명령어는 sub입니다. 덧셈에서 만든 소스를 활용하겠습니다.

 


add가 있던곳에 sub를 넣었습니다.


결과는 -10이 나옵니다. 10 - 20이므로 정상적으로 나왔습니다.


이번에는 레지스트가 아닌 메모리로 연산해보겠습니다.

sss주소에 10숫자가 들어가고 sub명령어로 뺄셈하여 20을 뺀 값이 sss에 저장되게 됩니다.

[] 처리를 하고 printf 해줍니다.


결과는 -10 그대로 확인이 됬습니다.


3. 곱셈(*)


곱셈의 명령어는 mul입니다. 혹은 imul를 사용할수있습니다.

mul은 피연산자가 1개이고 곱셈을 해서 eax레지스터와 ebx 레지스터에 저장합니다.

imul은 피연산자가 1부터 3개 까지 올수있으며 형식은 mul과 같습니다.



9876 * 4500 를 곱하는 프로그램입니다. 두개의 레지스터를 사용하였고 9876 * 4500 의 곱은 44442000 입니다. 결과를 확인하면 

678 8592로 결과가 나오는데 44442000값을 2진수로 표현하면 아래와 같습니다.

edx 레지스트의 값은 678 입니다. 이걸 2진수로 바꾸면 0000 0010 1010 0110 으로 나옵니다.

eax 레지스트의 값은 8592 입니다. 이걸 2진수로 바꾸면 0010 0001 1001 0000 으로 나옵니다.


두개의 레지스트를 사용하여 값이 따로 나오게 된겁니다. 두개의 레지스트 2진수값을 비교하면 정답임을 확인할수있습니다.


이번에는 imul을 사용해보겠습니다.

imul명령어를 사용해서 계산해보았습니다. 결과값은 98760으로 정답임을 확인할수있습니다. mul과 imul 둘중 사용하고 싶은걸 사용하면 됩니다.


4. 나눗셈(/)


나눗셈의 명령어는 div입니다. 나눗셈도 곱셈과같이 idiv가 있습니다. 형식은 div와 같습니다.


아까 곱셈에서 구한 값을 7412로 나누어 보았습니다. eax외 edx의 레지스트에 값이 들어가고 몫과 나머지가 출력됩니다.

결과는 7060 5995입니다. 5995가 몫이고 7060이 나머지입니다. 44442000 / 7412 를 해보면 정답임을 알수있습니다.

값은 해당설정한 비트값을 넘어갈수없습니다. 만약 16bit의 메모리 표현 범위가 넘어가는 32bit인 경우에는 16bit를 두개로 나눠서 담아야합니다.


Tip

나눗셈을 하며 플로팅포인트(Floating point exception (core dumped)) 에러가 날경우 아래의 3개중 하나를 써줍니다.


cbw            convert byte to word

cdw            conver double word to word 

cdq            convert double word to quad word

'보안 > System' 카테고리의 다른 글

System 어셈블리어 반복문  (0) 2018.01.18
System 명령어와 분기문  (0) 2018.01.17
System 레지스터(Register)  (0) 2018.01.16
System 어셈블리어  (0) 2018.01.12
System 컴파일  (0) 2018.01.11
Comments