태초의 프로그래밍 언어 어셈블리

assembly, 8086, x86

분량조절실패로 분리된 나눗셈

나눗셈은 곱셈처럼 부호있는 연산이 따로 있고 ax, dx 레지스터가 자동으로 사용된다는 것이 같습니다. 그리고 8비트 16비트 연산을 구별해야한다는 것도 같습니다.

div는 부호없는 나누기를 합니다. 오퍼랜드가 바이트일 경우 AX값을 나누고 AL에는 결과값이 AH에는 나머지가 저장됩니다. 오퍼랜드가 워드일 경우 DX:AX에 나누기를 실행하고 결과는 AX에 나머지는 DX에 저장됩니다.

dx:ax = 0:33이고 cx 값이 3일때 div cx를 하면ax=11, dx=0이 되는 식입니다.

idiv는 부호를 고려한 나누기를 하는 것뿐 다른 것들은 같습니다.

나누셈은 별로 자세하게 설명할 필요가 없을것 같습니다. 더 중요한건 div 명령이 아니라 shr, sar 을 쓰는 나눗셈입니다. 이런 shift 처리를 잘 해야 빠르게 곱셈/나눗셈을 하고 비트 연산도 할 수 있는 것입니다. 나눗셈을 주로 쓰는 연산이 좌표를 구할 때나 해시나 큐같이 배열에서 위치 찾을 때, 암호화, 비트 연산 등인데 대부분 일부러 나눗셈 명령을 쓰지 않고 shift 명령을 쓸 수 있도록 2의 배수로 나누기를 합니다. 연산 속도가 훨씬 빠르기 때문입니다. 속도가 깡패지요.

shift 연산은 다시 자세하게 설명하는게 좋을것 같습니다.

이걸로 사칙연산은 끝~

댓글

댓글 본문
작성자
비밀번호
  1. byte div할 때, mov cl을 mov cx로 하면, word div가 되서, DX에 나머지, AX에 몫이 나옵니다.
    idiv할 때, AX를 음수로 하면, 이것을 양수로 인식해서 원하는 계산이 안 나옵니다. CX를 음수로 하셔야 합니다. idiv에서도 byte div와 word div처럼 몫과 나머지가 나오는 위치가 다를 것 같은데, 해보지는 않았습니다.

    <사용한 코드>

    org 100h

    ; byte div
    mov al, 33
    mov cl, 2
    div cl ; AL=10h(quotient), AH=01h(remainder)

    ; word div
    mov ax, 0ffffh ; 65535
    mov cx, 5h
    div cx ; 3333h = 12288 + 768 + 48 + 3 = 13107

    mov ax, 100h ; 256
    mov cx, 07eh ; 126
    div cx ; AX=0002h(quotient), DX=0004h(remainder)

    ; fali idiv
    mov ax, -2 ; 0fffeh is not negative. why?
    mov cx, 2
    idiv cx ; 32767 (0111 1111 1111 1111)

    ; idiv
    mov ax, 33
    mov cx, -3
    idiv cx ; 0fff5h is -11.

    mov ax, 127
    mov cx, -127
    ;div cx ; ???
    idiv cx

    ret
  2. 구경꾼
    가급전 연산할때 AX 에 데이타부터 놓고 시작하게 되더군요.... 어차피 AX 를 많이 쓰니까요.... 기본 연산지원이 16비트 가감승제인데... 하다보니 16비트는 너무 적더군요.. 8086을쓰더라도 32비트나 64비트 연산 서브루틴이나 매크로를 별도로 만들어서 써야 할것 같아요.....
버전 관리
gurugio
현재 버전
선택 버전
graphittie 자세히 보기