2013-01-19 4 views
0

숫자가 소수 일 경우 true를 반환하고 그렇지 않으면 false를 반환하는 함수를 TASM에 작성하려고합니다.어셈블러에서 올바르게 나눌 수없는 이유는 무엇입니까?

masm 
model small 

.data 
pos db "Yes, it's Prime",13,10,"$" 
negat db "No, it's not Prime",13,10,"$" 

.stack 256 

.code 


isPrime proc 
    push bp; 
    mov bp,sp; 
    push bx; 
    push cx; 

    mov bx, [bp+4] 
    mov cx, 2; 

    cmp bx, 0; check for zero 
    je isPrimeFalse; 
    cmp bx, 3; ;check for <=3 
    jle IsPrimeTrue; 

    isPrimeCycle: 
     cmp bx, cx; 
     je IsPrimeTrue; 
     mov ax, bx; 
     xor dx, dx; 
     DIV cx; 
     cmp ah, 0h; 
     je IsPrimeFalse; 
     inc cx; 
     jmp isPrimeCycle; 

IsPrimeFalse: 
    mov ax, 0; false 
    jmp IsPrimeExit; 
IsPrimeTrue: 
    mov ax, 1; 
IsPrimeExit: 
    pop cx; 
    pop bx; 
    pop bp; 
    ret 2; 
isPrime endp 

main: 
    push 5; 
    call isPrime 
    cmp ax, 0; 
    je no; 
    jmp yes; 
yes: ... 
no: ... 
end main 

소수로는 작동하지 않지만 소수 인 경우 (숫자> 3, 예를 들어 5 이상)에는 여전히 NO가 표시됩니다.

내 실수는 어디에서 왔습니까? 알림은 AH에 저장되어야하지만, ollydbg에서 위의 코드를 디버깅 할 때 (작동하도록 x32 레지스터를 변경 했음) 미리 알림은 edx가 아니라 아에 저장됩니다. 왜?! 위 코드에서 그렇습니까?

내 주요 문제는 내 코드를 디버깅 할 수 없다. 내가 알고있는 유일한 강력한 디버거 인 ollydbg가 있지만 x32bit 어셈블러가 아니고 16 개이기 때문에 레지스터를 변경해야한다. 모든 ... 동일 DIV CX (일반적으로 DIV r/m16)에 대한

+0

32 비트 Windows에 debug.exe가 있습니다. Open Watcom 디버거 wd.exe가 있습니다. 볼랜드의 Turbo Debugger td.exe가 있습니다. 또한 32 비트 코드를 만들어 32 비트 프로그램의 일부로 컴파일 한 다음 OllyDbg 또는 다른 어떤 32 비트 디버거를 사용하여 디버그 할 수 있습니다. –

답변

3

나머지 DX, AX에 몫로 이동합니다.

8 비트 제수의 경우에만 나머지가 AH로 이동합니다. 하지만 분열하기 전에 DX을 0으로 설정 했으므로 분명히 16 비트 제수가 필요했습니다.

+0

감사합니다. –

관련 문제