관리 메뉴

Jsecurity

어셈블리 산술명령어 (Div) 본문

프로그래밍언어/리버싱 입문

어셈블리 산술명령어 (Div)

Great king 2019. 4. 14. 20:13

DIV / IDIV

div(divide) – 부호없는 데이터에 사용
idiv(integer divide) – 부호있는 데이터에 사용
기본적인 나눗셈 연산
• 워드/바이트 , 더블워드/워드, 쿼드워드/더블워드


형식
[라벨:]  div / idiv  레지스터 / 메모리


워드/바이트
AL – 몫을 저장
- 부호가 없는 경우 : 최대 +255(FFH)
- 부호가 있는 경우 : 최대 +127(7FH)
AH – 나머지를 저장

더블워드/워드

 

쿼드워드/더블워드

 

#제수[레지스터] : 피젯수[레지스터]

명령어 제수 피제수 나머지
div cl 바이트 ax al ah
div cx 워드 dx:ax ax dx
div rbx 더블워드 rdx:rax rax rdx

 

#제수[메모리] : 피젯수[레지스터]

명령어 제수 피제수 나머지
div byte [byte1] byte1 al ax ah
div word [word1] word1 ax ax : bx dx
div dword [dword1] dword1 rax rax : rdx rdx

 

실습1

#2500/300 = 몫, 나머지

%include "io64.inc"
section .data
    msg1 db "몫 = ", 0
    msg2 db "나머지 = ",0
section.bss
    a        resw 1
    b        resw 1
    share    resw 1
    residuum resw 1
section .text
    global CMAIN    
CMAIN:
    mov [a], dword 2500
    mov [b], dword 300
    mov rdx, 0  ;나머지를 rdx에 저장, 초기값으로 0
    mov rax, [a] ;피젯수의 값을 rax로 저장
    mov rcx, [b] ; 젯수의 값을 rcx 저장
    div rcx
    mov [share], rax
    mov [residuum], rdx
    PRINT_STRING msg1
    PRINT_DEC 2, share
    NEWLINE
    
    PRINT_STRING msg2
    PRINT_DEC 2, residuum
    NEWLINE
    xor rax, rax
    ret

 

실습2

#hap = kor + eng + mat mean = hap / 3

%include "io64.inc"
section .data
    kor dd 0
    eng dd 0
    mat dd 0
    stu_cnt dd 3    
    msg1 dw "total = ",0
    msg2 dw "average = ",0
    msg3 dw "namergi = ",0
section .bss
    hap resd 1
    mean resd 1
    namergi resd 1
section .text

global CMAIN
CMAIN:
    GET_DEC 2, [kor]
    GET_DEC 2, [eng]
    GET_DEC 2, [mat]
    
    mov rax, [kor]
    add rax, [eng]
    add rax, [mat]
    mov [hap], rax
    PRINT_STRING msg1
    PRINT_DEC  2, [hap]
    NEWLINE
    
    mov rdx, 0
    mov rax, [hap]
    div word [stu_cnt]
    mov [mean], rax
    mov [namergi], rdx
    
    PRINT_DEC 2, rax
    NEWLINE
    PRINT_DEC 2, rdx
    
    xor rax, rax
    ret

 

Comments