본문 바로가기

교육/ASSEM

[어셈블리어]imul과 div(idiv)와 확장명령어

imul
  • 음수를 포함한 수를 곱할때 필요한 명령어
  • eax와의 연산만이 아닌 레지스터끼리의 곱, eax가아닌 다른 레지스터와 메모리의 곱, 상수와의 곱을 가능하게한다. 
imul source eax와의 곱셈, 레지스터와 메모리만 올 수 있다.
imul register, source 두개의 operand를 가진다. add의 형식과 같이 곱한값이 operand1로 대입된다.
imul register, source, immediate 두개의 operand와 immediate 즉 상수를 가진다.

imul source에 대한 Operand 표

imul register, source에 대한 Operand표

imul register, source, immediate에 대한 Operand표


- imul의 곱 연산예시-

1. imul bx 는 ax = ax * bx로 해석 5*2 = 10을 16진수 값으로 ax에 할당한다.
2. imul Factor 는 Factor변수와 ax의 곱 ax = ax * Factor이 된다. (마찬가지로 16진수 값을 할당)
3. imul ebx, 10 은 ebx = ebx * 10(상수) 이다. 10 * 10이므로 100의 16진수 64를 ebx에 할당


1. imul ecx, Double 은 ecx = ecx * Double , imul은 부호가 있는 수의 곱이기 때문에 ecx와 Double은 음수로 해석된다.
2. imul bx, Value, 1000 의 연산값은 bx로 할당됨


(숙제)

-





div
  • 나눗셈
idiv
  • 부호가 있는 수의 나눗셈

source size메모리에는 잿수, AX Operand메모리에는 피잿수, AL에는 몫, AH에는 나머지가 할당된다.   
피잿수 = 잿수 * 몫 + 나머지
- 피잿수의 size에 따라 크기가 결정된다. -



 
1. eax = ebx / eax  즉  13 / 100 이다. 몫은 eax에 저장 나머지는 edx저장되었음.
2. 같은방식
3. 3번연산은 BYTE크기로 연산되었기 때문에 몫과 나머지가 각각 AX의 AH, AL공간에 저장된다. - AH에 나머지, AL에 몫 -




1. cx / ax , 1번은 idiv연산이기 때문에 cx의 값이 음수이다. 
(2의 보수를 취해주면 cx의 값은 -13이 된다.)
-13 / 100을 하면 몫은 -7(FFF9) 나머지는(9가 된다. 나머지는 음수와 음수의 계산으로 양수로 전환)
2.  13 / - 100
3. -13 / - 100, 음수끼리의 나눗셈이기 때문에 몫은 음수와 음수가 충돌해 양수가 되고 나머지는 음수가 된다.


1. bl / ax, -32 / -511
2. -1 / - 511





byte를 연산할 경우

AX의 값을 다 바꿔야하고


word를 연산할 경우

DX의 값도 바꿔야하고


double word를 연산할 경우

EDX의 값도 함께 바꿔줘야 한다.



예를 들면

div ebx 를 한다고 치면


mov   edx ,  0

mov   eax ,  2

mov   ebx ,  2

div    ebx


mov   edx ,  -1 (FF FF FF FF)

mov   eax ,  -2

mov   ebx ,  2

div    ebx



이런식으로 확장된 곳의 값도 함께 바꿔줘야 한다.



이런 불편함을 덜어주는 명령어가


cbw        AL  ->  AX

cwd        AX  ->  DX:AX

cdq         EAX  ->  EDX:EAX

cwde      AX  ->  EAX


이다.




cwd        AX  ->  DX:AX







cdq         EAX  ->  EDX:EAX









cbw        AL  ->  AX










cwde      AX  ->  EAX










------- movzx , movsx Instruction

8 bit를 16 bit로,

16 bit를 32 bit로

확장하여 값을 넣는다.





movzx , movsx 의 다른 점은

movzx 는 확장된 곳에 무조건 0 을 채워 넣고

movsx 는 확장된 곳에 부호에 맞게 채워 넣는다.