본문 바로가기
공부,일/어셈블리

ch4 4.3 Multiplication Instructions

by fromnothing1 2021. 8. 18.

곱셈 기본

 

imul(signed),mul(unsigned) :  곱하기 연산자

 

곱하기에서는 결과물이 소스의 byte 를 뛰어 넘을수 있다. 즉 8bit 숫자끼리 곱하면 많은 경우 16bit 데이터가 나올수 있다.  따라서 86 x 80 cpu  에서는 이러한 경우를 위해서 특별한 동작을한다. 

 

만약 al(8bit)  끼리 곱했는데 결과물은 ax( 16 bit) 레지스터에 저장된다. 

16 bit (ax) -> 32bit  가 될 경우는 하위 16bit 는 ax 에 저장되며 상위 bit 는 dx 레지스터에 저장된다 이를 DX:AX 라고 

표현한다. 

 

마찬가지로 

eax(32bit) -> EDX:EAX (64bit)

rax (64bit) -> RDX:RAX (128bit)

 

cf)  왜 ax:dx(32) 에저장하나 eax(32) 있는데  이는 옛날에는 32bit 레지스터가 없었고, 옛날 버전의 명령어를 그대로 가져왔기 때문이다. 

 

곱셈에서 플레그

위에서 말했다 싶이 곱셈은 2개의 레지스터를 통해서 결과를 표시한다. 

이때 상위 레지스터가 모두 0 이라면 CF,OF 는 0 이다. 

그러나 0 이 아니라면 1로 set 된다. 

 

mul 예시

 

imul ( signed)

3가지 타입이 존재 

 

1. imul source

위의 mul 과 거의 동일하다. 

하지만  modR/M 코드에서 reg = 100 for mul and reg = 101 for imul 이다. 

 

mul 과 다른점은 CF OF 플레그 이다. 

 

상위레지스터의  모든 bit 가 1 이고 하위  bit의 8번째 bit(sign bite) 가 1이면  CF,OF CLAER -> 정상작동중 

상위 모든 bit 가 0 일고 하위 8번재 bit(sign bite) 가 0 이면 CF,OF 1 set -> 이상 발생 

 

2. imul destination register, source

두번째 타입에서는 source 는 레지스터 , immediate , 메모리 모두 가능하다. 즉  add ,sub 명령어랑 비슷하다. 

곱셈 결과는 항상 destination register size 에 포함되어야 한다. (아니면 CF,OF 1 set 맞으면 clear)

 

 

3. imul register, source, immediate

register : destination

register = source(레지스터,메모리) * immediate  식으로 작동 

register 와 source 의 size 는 동일하다. 

 

곱셈한 결과의 크기가 register 크기에 들어가면 CF,OF clear 아니면 1 set 

 

1.2.3번 타입 예제

 

 

 

 

 

 

 

 

댓글