Contact Us  
    Today
     
    03 8671 0111

어셈블리어 div 예제

다음 예제에서는 사용자로부터 두 자리를 요청하고, EAX 및 EBX 레지스터에 각각 숫자를 저장하고, 값을 추가하고, 결과를 메모리 위치 `res`에 저장하고 마지막으로 결과를 표시합니다. 결장 (:) 은 연결됩니다. 제수 크기 4의 경우 EDX는 비트 32-63이고 EAX는 입력 번호의 0-31비트임을 의미합니다(이 예제에서는 낮은 비트 수가 덜 중요). 캐리와 함께 추가하십시오. src + CF를 dest에 추가하고 결과를 저장합니다. 일반적으로 레지스터 크기의 두 배 큰 값을 처리하는 일반 추가 명령을 따릅니다. 다음 예제에서 원본에는 대상에 추가될 64비트 번호가 포함되어 있습니다. 곱셈은 AX 레지스터에 있어야 하며 승수는 메모리또는 다른 레지스터의 단어입니다. 예를 들어 MUL DX와 같은 명령의 경우 승수를 DX에 저장하고 배율을 AX에 저장해야 합니다. 어셈블리 언어를 접하고 DIV 작업에 문제가 있습니다. 일반적으로 분할을 위한 32비트 입력 값이 있으므로 CDQ를 사용하여 분할 직전에 EAX를 EDX로 로그확장해야 하는 경우가 많습니다.

. 이것은 배당 레지스터의 값을 arg로 나눕니다. 8 비트 부문으로 배당금은 AX에서 유지되며 AH는 높은 비트이고 AL은 낮은 비트 (자연스럽게 충분히)입니다. 즉, 분할하기 전에 AH와 AL 모두에 적합한 값을 가져야 합니다. lea 명령은 특히 포인터의 산술 연산에 사용할 수 있습니다. 장 “데이터 전송”, § “로드 유효 주소”를 참조하십시오. 몫이 몫 레지스터에 맞지 않으면 산술 오버플로 인터럽트가 발생합니다. 모든 플래그는 작업 후 정의되지 않은 상태입니다.

. 이것은 src를 더해 주며, sest에 추가됩니다. MASM 구문을 사용하는 경우 결과는 첫 번째 인수에 저장되고 GAS 구문을 사용하는 경우 두 번째 인수에 저장됩니다. 진연대상은 8비트, 16비트 또는 32비트 오연산자일 수 있습니다. 인수의 레지스터 값을 1씩 증가시입니다. arg, 1을 추가하는 것보다 훨씬 빠르게 수행됩니다. . 배당금은 누적되어 있습니다. 두 명령 모두 8비트, 16비트 또는 32비트 진연산자에서 작동할 수 있습니다. 이 작업은 6개의 상태 플래그 모두에 영향을 줍니다. 다음 섹션은 다른 피연산자 크기와 분할의 세 가지 경우를 설명합니다 – DIV (분할) 명령은 서명되지 않은 데이터에 사용되며 IDIV (정수 분할)는 서명 된 데이터에 사용됩니다.

두 번째 경우 대상은 이전 프로세서용으로 작성된 코드와의 이전 버전과의 호환성을 위해 EAX가 아닙니다. 이 경우 한 자리 숫자만 나누기 때문에 가장 좋은 방법은 AH를 지우는 것입니다: ADD 및 SUB 명령은 바이트, 단어 및 doubleword 크기, 즉 8- 비트, 16비트 또는 32비트 진연산자. 곱셈은 AL 레지스터에 있고 승수는 메모리 또는 다른 레지스터의 바이트입니다. 제품이 AX에 있습니다. 제품의 고차 8 비트는 AH에 저장되고 낮은 순서 8 비트는 AL에 저장됩니다. 이진 데이터를 곱하기 위한 두 가지 지침이 있습니다. MUL(곱하기) 명령은 서명되지 않은 데이터를 처리하고 IMUL(정수 곱하기)은 서명된 데이터를 처리합니다. 두 명령 모두 캐리 및 오버플로 플래그에 영향을 미칩니다.

이렇게 하면 arg에 AX 레지스터의 해당 바이트 길이 값이 곱합니다.

Accredited with:

excellence and integrity

JHL Civil Pty Ltd ABN 79144 907 514, 10A Phillip Court, Port Melbourne, Victoria (VIC), 3207 Australia
© Copyright JHL Civil 2013