성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • ARM Reverse Engineering
  • WINAPI
  • Boot Code 분석
  • 문자열 나누기
  • MFC

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.08.29_Division Instructions
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

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


저작자표시 (새창열림)

'Assembly' 카테고리의 다른 글

2013.09.04_jmp_instruction  (0) 2013.09.04
2013.09.02_ASM_Convering Instruction  (0) 2013.09.02
2013.08.28_ASM_Basic Instruction  (0) 2013.08.28
2013.08.27_EFLAGS레지스터의구조  (0) 2013.08.27
2013.08.27_ASM_APPENDIX 활용하기 and 4장 Basic Instruction  (0) 2013.08.27
    'Assembly' 카테고리의 다른 글
    • 2013.09.04_jmp_instruction
    • 2013.09.02_ASM_Convering Instruction
    • 2013.08.28_ASM_Basic Instruction
    • 2013.08.27_EFLAGS레지스터의구조
    성엽이
    성엽이

    티스토리툴바