0

这是我尝试在 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 中,而不是 ah 中。为什么?!在上面的代码中是这样吗?

我的主要问题是我无法调试我的代码,因为我使用 tasm,而我所知道的唯一强大的调试器是 ollydbg,但它是 x32 位汇编器,而不是 16。所以我必须更改寄存器,也许并非一切都是一样的。 ..

4

1 回答 1

3

对于DIV CX(并且通常DIV r/m16)余数为DX,商为AX

仅对于 8 位除数,余数归 AH。但是您显然想要 16 位除数,因为您在除数DX之前要归零。

于 2013-01-19T20:22:39.067 回答