2014-05-15 2 views
0

최종 시험을 위해 공부하고있는 질문이 있습니다. 사용자가 양의 값을 입력 할 때까지음수 - only_and_divisible_by_4 정수의 합을 계산하십시오.

가 (키보드) 입력 음 only_and_divisible_by_4 정수의 합을 계산하는 프로그램을 작성 사용자가 100

다음은 내 코드이며이 작동 :이 질문입니다. 수를 나눌 경우 내가 좀 더 효율적인 코드를 만들 수 있도록 사전에 여러분 모두 감사합니다

.data 

prompt BYTE "No Positive Numbers!",0 
done BYTE "Finished..",0 
notdivisible BYTE "This number is not divisble!",0 

.code 
start: 


mov ebx,0 

readin: 
    call ReadInt 
    cmp eax,100 
    je finish 
    cmp eax,0 
    jg positive 
    mov ecx,eax 
    neg ecx 
checkifdivisible: 
    sub ecx,4 
    cmp ecx,0 
    jl notdiv 
    jg checkifdivisible 
    je divisible 

divisible: 
    add ebx,eax 
    LOOP readin 

notdiv: 
    mov edx,OFFSET notdivisible 
    call WriteString 
    call Crlf 
    jmp readin 

positive: 
    mov edx,OFFSET prompt 
    call WriteString 
    call Crlf 
    jmp readin 

finish: 
    call Crlf 
    mov edx,OFFSET done 
    call WriteString 

    xchg ebx,eax 
call Crlf 
call WriteInt 


exit 
end start 

4.

에 의해 확인하는 것입니다하지만 더 효율적인 방법이 궁금! 나는이 대답이 너무 길다는 느낌이 든다.

답변

2

nn AND 3 == 0 인 경우 4로 나눌 수 있습니다. C 검사 :

#include <stdio.h> 
#include <stdint.h> 

static void 
is_div4(int32_t n) 
{ 
    printf("%5d => 0x%08x, %d, %.2f\n", 
    n, n, ((uint32_t) n & 3) == 0, (double) n/4.0); 
} 

int 
main(int argc, char **argv) 
{ 
    is_div4(-100); 
    is_div4(-4); 
    is_div4(-102); 
    is_div4(-338); 
    is_div4(-108); 

    return 0; 
} 

출력 :

-100 => 0xffffff9c, 1, -25.00 
    -4 => 0xfffffffc, 1, -1.00 
-102 => 0xffffff9a, 0, -25.50 
-338 => 0xfffffeae, 0, -84.50 
-108 => 0xffffff94, 1, -27.00 

간단한 구현 :

mov  eax, NUMBER 
    and  eax, 0x3 
    cmp  eax, 0 
    jne  NotDividableBy4 
    ; dividable by 4 
NotDividableBy4: 
    ; 
관련 문제