어셈블리어와 악성코드

어셈블리어 명령어 [MUL, DIV]

YaluStar 2018. 11. 18. 22:03

어셈블리어 명령어 [MUL, DIV]



MUL (Unsigned Integer Multiply)

부호 없는 AL, AX, EAX의 값을 피연산자와 합니다. 피연산자가 8Bit이면 AL과 곱해서 AX에 저장되고 16Bit이면 AX와 곱하고 DX:AX에 저장됩니다.

결과에 따라 OF, ZF 플래그가 세트 될 수 있습니다.


Ex) MUL BL => BL * AL

Ex) MUL BX => BX * AX

Ex) MUL EBX => EBX * EAX


AX 16Bit, BX 16Bit

MUL을 하게 되면 최대 32Bit가 되며, 상위 16Bit는 DX에 값이 저장되고, 하위 16Bit는 AX에 값이 저장됩니다.


실습 환경

VMware Workstation 15 Player (FREE 버전)

Windows XP Professional SP3 (32Bit)

 


CMD창을 열어 debug 명령어를 입력합니다.

-a 100

:0100  MOV AX, 8000

:0103  MOV BX, 3

:0106  MUL BX

명령어를 입력합니다.





명령어를 실행하면 먼저 AX=8000 값이 들어가게 되고, BX=0003의 값이 들어가게 됩니다.

이어서 MUL BX 명령어를 사용하게 되면 AX * BX을 하게 되기 때문에 8000*3 = 24000이라는 값이 나옵니다. 그러면 AX=FFFF을 넘어가는 값이 나오기 때문에 OF(Overflow Flag)가 초기 상태인 NV(No Overflow) 였다가 OV(Overflow)로 변경됩니다.


AX=24000의 값이 들어가게 되는것이 아니라 AX=8000의 값이 들어가게 됩니다.

AX 레지스터에 들어가는 값의 경우 16진수를 사용하기 때문에 24000-16000 = 8000의 결과로 인해 8000의 값이 들어가는 것 입니다.

나머지 16000의 값DX로 들어가게 되는데 DX에 16000이 아닌 0001의 16진수 값이 들어가게 됩니다.


뒤에 4자리는 AX에 들어가고 앞의 나머지 자리수가 DX로 들어가기 때문에 DX에는 0001이라는 값이 들어가게됩니다.

결과적으로 AX=8000, DX=0001이라는 값이 나오게 됩니다.






DIV (Unsigned Integer Devide)

8, 16, 32 Bit 부호 없는 정수의 나눗셈을 수행합니다.

결과에 따라 CF, OF, ZF 플래그가 세트 될 수 있습니다.


사용하는 양식레지스터메모리만 사용할 수 있습니다.

DIV reg

DIV mem



실습 환경

VMware Workstation 15 Player (FREE 버전)

Windows XP Professional SP3 (32Bit)


CMD창을 열어 debug 명령어를 입력합니다.

-a 100

:0100  MOV AX, 3

:0103  MOV BX, 2

:0106  DIV BX

명령어를 입력합니다.





DIV BX 명령어를 실행하면 AX / BX을 실행하는 것과 같습니다.

그래서 나오는 몫 값은 AX에 저장되고, 나머지 값은 DX에 저장이 됩니다.

BX는 입력한 값이 그대로 유지됩니다.

명령어를 실행하고 나면 최종 결과 값으로 AX=0001, BX=0002, DX=0001가 나오게 됩니다.





이상으로 어셈블리어 명령어 MUL, DIV에 대하여 알아보았습니다.

감사합니다.


반응형