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 는 확장된 곳에 부호에 맞게 채워 넣는다.












설정

트랙백

댓글