2016-10-15 4 views
0

레지스터 ax의 값이 remainder = 0 인 7로 나눌 수 있는지 확인하고 싶습니다. 어떻게 할 수 있습니까?레지스터가 7로 나눌 수 있는지 어떻게 확인할 수 있습니까?

+1

의 배수했다 것인가? 16 비트 모드로 제한되어 있습니까? 그렇다면 이유는 무엇입니까? IDIV를 사용한 답변이 받아 들여 지거나, (느린) 하드웨어 분할 명령어를 피하는 영리한 트릭을 찾고 있습니까? 왜 어셈블리 언어를 처음부터 손으로 작성하고 있습니까? – zwol

답변

6

this answer에 표시된 것과 같은 방식으로 사용할 수 있습니다. 상수는 물론 다릅니다.

2 16은 (정의) 형태 x = n * 7의 숫자가 n0xffff/7 이하인 것 x * 0x6db7 = n을 준수한다는 것을 의미 0x6db7, 7 개조의 모듈 역수. 따라서 x * 0x6db7에서 더 큰 값을 얻으면 7의 배수가 아닙니다. 또한 7의 배수가 아닌 값은 낮은 결과로 매핑 할 수 없습니다. 기수가 2의 제곱을 곱하는 배수는 전체 반복이기 때문입니다.

그래서 당신은이 과정의 부호없는 숫자입니다

imul ax, ax, 0x6db7 
cmp ax, 0x2492 
ja not_multiple_of_7 

(테스트하지)를 사용할 수 있습니다. 보너스로

, ax 서명 또는 서명으로서 AX의 값이 처리되어야 7 IFF에 의해 분할 된 원래의 값이 제

+0

곱하기가있는 CPU (예 : 인텔을 표시하고있는 경우)는 일반적으로 나머지를 생성 할 나누기 명령어가 있습니다. 나머지를 나누고 확인하십시오. 개념적으로 더 간단합니다. 이 수표의 실적 *이 중요 할 때 귀하의 계획은 훌륭합니다; 그렇다면이 계획을 사용해야합니다 (적절한 주석을 달아 표시해야합니다). 대부분의 상황에서 성능은 중요하지 않습니다.이 마법의 비트는 대부분 독자에게 불투명 해지며 수학에 의존하기 때문에 유지하기 어려운 코드를 생성합니다 대부분의 독자는 가지고 있지 않습니다. (상향 투표는 영리하기 때문에). –

+0

@IraBaxter : 나는 질문에서 "나머지가 없다"라는 구절은 "나머지 명령을 사용하지 않음"을 의미한다고 생각했다. 그러나 OP의 자체 답변은 그것이 의미하는 바가 아니라는 것을 증명합니다. –

1
org 100h 
    mov ax,14 
    mov cl,7 
    div cl 
    cmp ah,0 
    je positive 
    PRINTN "The number has a remainder" 
    jmp finish 
positive: 
    PRINTN "The number has no remainder" 
finish: 
PRINTN "After comparison" 
mov ah, 0 
int 16h 
ret 
+2

좋습니다.하지만이 점에주의하십시오. 255 이하의 몫을 사용하므로 1792 이상에서는 #DE가 발생합니다 – harold