[Multiplication, Division]
MUL(unsigned multiply)명령어는 부호없는 AL, AX, EAX를 피연산자와 곱한다.
Implied Operands
Multiplicand | Multiplier | Product |
AL(8) | r/m8 | AX (16) |
AX(16) | r/m16 | DX:AX (16bit 레지스터 2개 사용) |
EAX(32) | r/m32 | EDX:EAX (32bit 레지스터 2개 사용) |
IMUL명령어는 음수를 포함한 수를 곱할때 필요한 명령어이다.
EAX와의 연산 뿐만 아니라 레지스터의 곱, 레지스터와 메모리의 곱, 상수와의 곱이 가능하다.
부호를 고려한 곱셈인 IMUL의 예를 들어보자.
ECX = ECX * Double 를 한다.
ECX와 Double 모두 음수로 인식한다.
ECX와 Double를 곱한 값을 ECX에 16진수 형태로 저장한다.
DIV 명령어는 나눗셈을 하는 명령어다.
예시를 들어보자.
8003을 100으로 나누는데, 16비트 오퍼랜드를 사용한다. (dx, ax, cx 모두 16비트)
div cx로 ax를 cx로 나눈다. 나눈 몫을 ax에 저장하고, 나머지는 처음에 초기화시킨 dx에 저장한다.
중요한 것은 부호가 있는 정수의 나눗셈이다. (IDIV)
첫 번째 순서는 sign bit를 high operand에 채운다.
[CBW, CWD, CDQ]
CBW, CWD, CDQ명령어는 아래와같은 sign-extension을 제공한다.
- CBW (Convert Byte to Word) AL을 AH로 확장
- CWD (Convert Word to Doubleword) AX를 DX로 확장
- CDQ (Convert Doubleowrd to Quadword) EAX를 EDX로 확장
갑자기 CBW CWD CDQ가 나온 이유는 위에 sign bit로 확장시키는 첫 번째 순서 때문이다.
Examples
간혹가다 이렇게 연산되는 경우가 있다.
AX 00 64
byte at DivisorL: 0D
이런 경우에는 몫과 나머지가 각각 AX의 AH, AL공간에 저장된다.
AH 나머지 / AL 몫
[Extended addition and subtraction]
[ADC(add with carry)]
ADC명령어는 source operand(레지스터들끼리 계산)와 carry flag를 더해서 destination operand에 저장한다. (64bit 연산 가능)
[SBB(subtract with borrow)]
SBB명령어는 source operand(레지스터들끼리 계산)와 carry flag를 빼서 destination operand에 저장한다.
SBB명령어도 64비트 뺄셈이 가능하다.
EDX:EAX 0000000100000000h로 설정해놓고 1을 빼보자.
아래 32비트에서 먼저 뺄셈이 실행되고, Carry Flag를 설정한다.
그 후에 위 32bit에서 Carry Flag를 포함한 뺄셈을 진행한다.
결론적으로 ADC는 일반적인 ADD에 Carry Flag를 더한다.
SBB는 일반적인 SUB에 Carry Flag가 0이면 1을 추가적으로 빼고, Carry Flag가 0이면 빼지않는다.
'BoB > 합격 후 활동' 카테고리의 다른 글
Intel x86 Insturction Set Architecture - 5 (0) | 2019.11.17 |
---|---|
Intel x86 Insturction Set Architecture - 4 (0) | 2019.11.04 |
Intel x86 Insturction Set Architecture - 3 (0) | 2019.11.02 |
Intel x86 Insturction Set Architecture - 2 (0) | 2019.10.31 |
Intel x86 Instruction Set Architecture - 1 (0) | 2019.10.28 |