Assembly

2013.08.29_Division Instructions

성엽이 2013. 8. 29. 16:18


 Division Instructions

 


  - AX 는 2byte 이므로 1byte( byte ) 로 나누면 1byte ( 몫 ) 과 1byte ( 나머지 ) 가 나옴

  - 마찬가지로 2byte( word ) 로 4byte ( DX:AX ) 를 나누면 2byte ( AX ) 와 2byte ( DX ) 가 나옴

  - EDX:EAX ( 8byte ) = doubleword(4byte) / EAX(4byte) + [EDX(4byte)]



 예제 소스

 


.386    ;// 386 이상의 기계어를 사용하겠음
.MODEL FLAT  ;// MEMORY MODEL > 메모리형태 평평한 형태

ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD  ;// ExitProcess < 함수이름, dxExitCode 종료할때 byte 크기 > DWORD(4byte), 타입 , 32bit, stdcall 표준함수

.STACK 4096

.DATA
Divisor  BYTE  ?  
 
.CODE  ;// 코드영역 ( . 은 방향을 나타냄 거의 시작점 ), 함수나 변수가 저장
_smart:  ;// C에서는 함수이름이 smart인데 ASM에서는 ' _ '를 붙여준다.  
       mov  edx , 0h
       mov  eax , 64h
       mov  ebx , 0dh
       div  ebx

       mov  dx , 0h
       mov  ax , 64h
       mov  cx , 0dh
       idiv  cx

       mov  ax, 64h
       mov  Divisor, 0dh
       div  Divisor

       INVOKE   ExitProcess, 0

PUBLIC  _smart  ;// 외부에 호출 가능하도록 하려면 PUBLIC을 붙여서 호출해준다. 
END


 = > Debug 모드로 레지스터 값을 확인하면 몫 과 나머지가 따로 쓰이고 , 어떤식으로 저장이 되는지 확인 할 수 있다.

 = > 예를 들어 EAX = 100 , EBX = 13 이다.

       100/13 = 13*7+9 

       즉, 7(몫)이 EAX에 9(나머지)가 EDX에 저장이 된다.


 예제 소스(2의보수포함)

 




 .386    ;// 386 이상의 기계어를 사용하겠음
.MODEL FLAT  ;// MEMORY MODEL > 메모리형태 평평한 형태

ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD  ;// ExitProcess < 함수이름, dxExitCode 종료할때 byte 크기 > DWORD(4byte), 타입 , 32bit, stdcall 표준함수

.STACK 4096

.DATA
  
.CODE  ;// 코드영역 ( . 은 방향을 나타냄 거의 시작점 ), 함수나 변수가 저장
_smart:  ;// C에서는 함수이름이 smart인데 ASM에서는 ' _ '를 붙여준다.  
  mov  EDX, 0h
  mov  AX, 64h
  mov  CX, 0fff3h

  idiv  CX

  mov  DX, 0ffffh
  mov  AX, 0ff9ch
  mov  CX, 000dh

  idiv  CX

  mov  DX, 0ffffh
  mov  AX, 0ff9ch
  mov  CX, 0fff3h
  
  idiv  CX

  mov  AX, 0fe01h
  mov  BL, 0e0h

  idiv  BL

  INVOKE   ExitProcess, 0

PUBLIC  _smart  ;// 외부에 호출 가능하도록 하려면 PUBLIC을 붙여서 호출해준다.
END


=> '-' (마이너스) 계산은 2의보수를 취해서 가능하게 한다. 저장되는 방식은 위에 언급했음. 나머지는 DX , 몫은 AX ..


===== 소스 ====

div_ex1.asm


div_ex2.asm

=================