곱셈 기본
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 된다.
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
'공부,일 > 어셈블리' 카테고리의 다른 글
스택 ebp ,esp레지스터 , 함수 호출 , return(수업준비) (0) | 2021.08.20 |
---|---|
ch4 4.4 Division Instructions (0) | 2021.08.18 |
ch4. 2 Integer Addition and Subtraction Instructions (0) | 2021.08.17 |
ch.4 - mov 완전정리 ( copy data) (0) | 2021.08.17 |
ch3 data & operand (0) | 2021.08.16 |
댓글