프로그래밍언어/리버싱 입문
어셈블리 산술명령어 (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