20140729 (Assembly imul, idiv, div, cbw, cwd, cdq, cwde, movsx, movzx)
112일차
--------------
Assembly
--------------
------- imul Instruction
부호 있는 곱셈
flags는 CF, OF만 사용하고 함께 set된다.
3가지가 있다.
--- 1. imul source
eax, ax, al의 값과 operand 값과 연산을 하고
연산된 값은 edx:eax, dx:ax, ax에 저장된다.
--- 2. imul Reg, source
위와 좀 다른데
operand1 과 operand2와 연산하여
operand1 에 저장한다.
넘는 값은 짤리고 CF, OF가 set 됨
--- 3. imul Reg, source, immediate
이것도 좀 다른데
source 와 immediate 를 연산하여
Destination에 저장한다.
넘는 값은 짤리고 CF, OF가 set 됨
몇 가지 예제)
------- div, idiv Instruction
나눗셈
나눗셈은 flags가 바뀌지 않는다.
연산을 할 때에 잿수는 두 배의 크기여야 한다.
위의 표와 같이
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 는 확장된 곳에 부호에 맞게 채워 넣는다.