-
20140729 (Assembly imul, idiv, div, cbw, cwd, cdq, cwde, movsx, movzx)부산IT학원/스마트컨트롤러 2014. 7. 29. 15:58
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 는 확장된 곳에 부호에 맞게 채워 넣는다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140731 (Assembly loop, 배열, lea, pipe line) (0) 2014.07.31 20140730 (rounding factor, adc, sbb, clc, stc, cmc, jmp, cmp) (0) 2014.07.30 20140728 (add, sub, inc, dec, neg, mul) (0) 2014.07.28 20140725 (Assembly Flags Register) (0) 2014.07.25 20140724 (ASM mov, xchg) (0) 2014.07.24