숫자가 소수 일 경우 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
)에 대한
32 비트 Windows에 debug.exe가 있습니다. Open Watcom 디버거 wd.exe가 있습니다. 볼랜드의 Turbo Debugger td.exe가 있습니다. 또한 32 비트 코드를 만들어 32 비트 프로그램의 일부로 컴파일 한 다음 OllyDbg 또는 다른 어떤 32 비트 디버거를 사용하여 디버그 할 수 있습니다. –