这是我在TASM中编写函数的尝试,如果数字为素数则返回true,否则返回false。
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中,而不是啊。为什么?!在上面的代码中是这样吗?
我的主要问题是我无法调试我的代码,因为我使用tasm并且我知道唯一的强大调试器是ollydbg,但它是x32bit汇编程序,而不是16.所以我必须更改寄存器,也许不是一切都是一样的......
答案 0 :(得分:3)
对于DIV CX
(通常为DIV r/m16
),剩余部分转到DX
,商为AX
。
仅对于8位除数,剩余部分转到AH。但你显然想要16位除数,因为你在除法之前将DX
置零。